powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Странности с EF Core #2
16 сообщений из 16, страница 1 из 1
Странности с EF Core #2
    #40053055
senglory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
[Table("prom_term", Schema = "demo")]
    public class PromTerm
    {
        [Key]
        [Column("promotion_terminal_id")]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
        [Column("promotion_id")]
        public int Promotionld { get; set; }
        [ForeignKey("Promotionld")]
        public DbPromotion Promotion { get; set; }
        [Column("pos_terminal_id")]
        public string POSTerminalld { get; set; }
        [Column("retailer_name")]
        public string RetailerName { get; set; }
        [Column("promotion_report_period_id")]
        public int ReportPeriodld { get; set; }
        [ForeignKey("ReportPeriodId")]
        public PromReportPeriod RepoortPeriod { get; set; }
    }

    public class FamilyTeamSvcDbContext : DbContext
    {

        ...
        public DbSet<PromTerm> PromotionTerminals { get; set; }
    }

            using var ctx = new FamilyTeamSvcDbContext(options);
            var promoTerminals = new List<PromTerm>{
                    new PromTerm
                    {
                        POSTerminalId="777777", 
                        RetailerName="8888"
                    },
                    new PromTerm
                    {
                        POSTerminalId="333",
                        RetailerName="AAA"
                      },
                      new PromTerm
                    {
                        POSTerminalId="qqq",
                        RetailerName="AAA"
                    },
                    new PromTerm
                    {
                        POSTerminalId="qqq",
                        RetailerName="BBB"
                    }
                }
                ;
            promoTerminals.ForEach(x => {
                x.Promotionld = 1;
                x.ReportPeriodld = 2;
                //ctx.PromotionTerminals.Append(x);
                }
            );

            ctx.PromotionTerminals.AddRange(promoTerminals);



И прямо на AddRange ловлю:
авторSystem.InvalidOperationException : The instance of entity type 'PromTerm' cannot be tracked because another instance with the same key value for {'PromotionId', 'POSTerminalId'} is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attached. Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see the conflicting key values.
Stack Trace:
IdentityMap`1.ThrowIdentityConflict(InternalEntityEntry entry)
IdentityMap`1.Add(TKey key, InternalEntityEntry entry, Boolean updateDuplicate)
IdentityMap`1.Add(TKey key, InternalEntityEntry entry)
NullableKeyIdentityMap`1.Add(InternalEntityEntry entry)
StateManager.StartTracking(InternalEntityEntry entry)
InternalEntityEntry.SetEntityState(EntityState oldState, EntityState newState, Boolean acceptChanges, Boolean modifyProperties)
InternalEntityEntry.SetEntityState(EntityState entityState, Boolean acceptChanges, Boolean modifyProperties, Nullable`1 forceStateWhenUnknownKey)
EntityGraphAttacher.PaintAction(EntityEntryGraphNode`1 node)
EntityEntryGraphIterator.TraverseGraph[TState](EntityEntryGraphNode`1 node, Func`2 handleNode)
EntityGraphAttacher.AttachGraph(InternalEntityEntry rootEntry, EntityState targetState, EntityState storeGeneratedWithKeySetTargetState, Boolean forceStateWhenUnknownKey)
InternalDbSet`1.SetEntityState(InternalEntityEntry entry, EntityState entityState)
InternalDbSet`1.SetEntityStates(IEnumerable`1 entities, EntityState entityState)
InternalDbSet`1.AddRange(IEnumerable`1 entities)


В честь чего оно решило что 'PromotionId' +'POSTerminalId' — это ключ? У меня в схеме об этом ни слова. Но на этом приколы не заканчиваются — если раскомментить Append() и закомментить AddRange(), то добавление проходит на ура, и на "ключ" оно не жалуется. ЧЯДНТ? И как писать такое правильно?
...
Рейтинг: 0 / 0
Странности с EF Core #2
    #40053059
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя в OnModelCreating ничего дополнительно не конфигурируется?
...
Рейтинг: 0 / 0
Странности с EF Core #2
    #40053068
senglory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,


Fixed. Проблема была в OnModelCreating, где, как оказалось, был код, который определял ключ сущности по-своему, а не по-атрибутному. Но возникает вопрос — а кк сделать так, чтобы композитные ключи в EF Core (именно в Core) работали через декораторы атрибутами, а не через FluentApi ?
...
Рейтинг: 0 / 0
Странности с EF Core #2
    #40053070
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
senglory
Fixed. Проблема была в OnModelCreating, где, как оказалось, был код, который определял ключ сущности по-своему, а не по-атрибутному. Но возникает вопрос — а кк сделать так, чтобы композитные ключи в EF Core (именно в Core) работали через декораторы атрибутами, а не через FluentApi ?

По-моему никак. Но я, если честно, всегда против того, чтобы конфигурить EF аттрибутами. Из соображений "чистоты" модели. Т.е. чтобы модель POCO была отдельно, а меппинг (контекст) отдельно. Если в модели атрибут [Required] или [MaxLength], то это нормально, т.к. это аттрибуты самого домена, но всякие [Table], [Key], [Column], [ForeignKey] и прочее должно конфигурится флуентом. Дело вкуса, конечно.
...
Рейтинг: 0 / 0
Странности с EF Core #2
    #40053235
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
senglory
работали через декораторы атрибутами, а не через FluentApi ?


В смысле? Вы хотите, чтобы код, который написан через fleunt не работал?
Понимаете, что это несколько странно до уровня крайней упоротости?
Уберите код, который вам мешает.

А то это выглядит, что у вас в каком-то месте написано сложение чисел, это вам вдруг стало мешать, и вы спрашиваете, а как бы сделать так, чтобы сложение чисел не работало во всей программе?

-- Зовите санитаров!
...
Рейтинг: 0 / 0
Странности с EF Core #2
    #40053242
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
В смысле? Вы хотите, чтобы код, который написан через fleunt не работал?

Не, он имел в виду - как сконфигурировать составной ключ сущности с помощью аттрибутов.
...
Рейтинг: 0 / 0
Странности с EF Core #2
    #40053248
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
В смысле? Вы хотите, чтобы код, который написан через fleunt не работал?

Не, он имел в виду - как сконфигурировать составной ключ сущности с помощью аттрибутов.


Аа... пффф..

Ну, в EF6 это было можно. В EF Core даже если нельзя, можно создать свои соглашения и атрибуты и добиться желаемого.

В целом согласен с тобой, что в атрибуты нельзя тащить параметры маппинга в БД.

Самый верняк, это писать реализации интерфейса IEntityTypeConfiguration<TEntity> и регистрировать их в DbContext-е.
...
Рейтинг: 0 / 0
Странности с EF Core #2
    #40053257
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
В EF Core даже если нельзя

Нельзя :) Без "даже" и "если" :))

PM> Add-Migration FooThe entity type 'Foo' has multiple properties with the [Key] attribute. Composite primary keys can only be set using 'HasKey' in 'OnModelCreating'.

hVostt
можно создать свои соглашения и атрибуты и добиться желаемого.

Ну это какой-то совсем оверинженеринг. Врят ли у человека хотя бы несколько таких сущностей (с композитным клучом), чтобы так морочиться.
...
Рейтинг: 0 / 0
Странности с EF Core #2
    #40053287
senglory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

В чем прелесть атрибутов - пишется все коротко, ощутимо короче, чем в FluentApi. Поэтому мне и непонятно, в честь чего для EF Core атрибуты оставили в таком недобитом состоянии - вроде и есть, а вроде и выкинуть их хотят.
...
Рейтинг: 0 / 0
Странности с EF Core #2
    #40053338
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
senglory
hVostt,

В чем прелесть атрибутов - пишется все коротко, ощутимо короче, чем в FluentApi. Поэтому мне и непонятно, в честь чего для EF Core атрибуты оставили в таком недобитом состоянии - вроде и есть, а вроде и выкинуть их хотят.


там еще много чего не доделано. в целом, атрибуты норм. но, как писал fkthat, лучше их по минимуму. чтобы не привязываться к конкретной СУБД
...
Рейтинг: 0 / 0
Странности с EF Core #2
    #40053403
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Ну это какой-то совсем оверинженеринг. Врят ли у человека хотя бы несколько таких сущностей (с композитным клучом), чтобы так морочиться.


Это не оверинжениринг, это из всех самый лучший способ определения маппинга: создавать классы IEntityTypeConfiguration<TEntity> на каждую сущность.

Прописывать маппинг сущностей в OnModelCreating это колхоз. Выносить маппинг в какие-то левые кастомные классы это колхоз.

Использовать атрибуты тоже колхоз ещё тот.

Колхоз хорош на небольших проектах, где лень заморачиваться.
...
Рейтинг: 0 / 0
Странности с EF Core #2
    #40053405
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
senglory
hVostt,

В чем прелесть атрибутов - пишется все коротко, ощутимо короче, чем в FluentApi. Поэтому мне и непонятно, в честь чего для EF Core атрибуты оставили в таком недобитом состоянии - вроде и есть, а вроде и выкинуть их хотят.


Тем, что абстракция сущности прибивается гвоздями к деталям хранения. Более того, сложный маппинг не вывозится атрибутами.
...
Рейтинг: 0 / 0
Странности с EF Core #2
    #40053418
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Это не оверинжениринг, это из всех самый лучший способ определения маппинга: создавать классы IEntityTypeConfiguration<TEntity> на каждую сущность.

Я имел в виду кастомные конвенции :))
...
Рейтинг: 0 / 0
Странности с EF Core #2
    #40053465
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Это не оверинжениринг, это из всех самый лучший способ определения маппинга: создавать классы IEntityTypeConfiguration<TEntity> на каждую сущность.

Я имел в виду кастомные конвенции :))


Конвекции хорошо подходят на штампованных проектах. Когда у тебя их много не очень больших и хочется просто сэкономить время на тираже.
...
Рейтинг: 0 / 0
Странности с EF Core #2
    #40053482
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Конвекции хорошо подходят на штампованных проектах. Когда у тебя их много не очень больших и хочется просто сэкономить время на тираже.

Я только один раз в жизни писал эти кастомные конвенции. У DBA там были свои правила именования для БД, а, понятно, все эти переименования .NET <-> БД мепить руками совсем не хотелось.
...
Рейтинг: 0 / 0
Странности с EF Core #2
    #40053593
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

А я на штамповке :)
Мы типа бойлерплейт сделали с кучей конвекций, при чём почти даже без атрибутов, чисто на соглашениях.
Потом отдали шараге, которая пилила кучу микроприложений, иногда поддерживая этот плейт.

Как оказалось, это примерно на порядки быстрее, чем делать какой-то супер-фреймворк-платформа аля убийца 1С или веб-дельфи. Просто быстрее и всё.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Странности с EF Core #2
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (8): Анонимы (6), Bing Bot, Yandex Bot 3 мин.
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]