Невозможно сопоставить ваше предложение модели домена с заданной структурой таблицы. По моему мнению, это также неправильно - с точки зрения домена - вводить флаг Is_Primary
в таблицу гражданства (которая в основном является таблицей соединений между Person
и Country
).
Домен говорит, что у человека может быть одно первичное гражданство (или, возможно, нет), но никогда много . Это неправильно выражено в структуре таблицы: столбец Is_Primary
может быть задан для более чем одной страны для данного человека. Также сложно изменить основное гражданство для человека, потому что вам придется искать все записи в таблице гражданства, принадлежащей этому человеку, если есть другая страна, помеченная как основная, а затем сбросьте этот флаг, прежде чем установить флаг для новой страны .
Это правильно выражено в вашей модели, что означает, что Person
должен иметь внешний ключ к таблице Country
(обязательный или необязательный). Для изменения основного гражданства потребуется только установить для этого ФК другое значение. Дублирующие первичные флаги невозможны в этой модели.
Если вы измените структуру таблицы следующим образом ...
**Person Table**
Person_Id int identity (PK)
First_Name nvarchar(30)
PrimaryCountry_Code char(2) (FK to Country table)
...
**Citizenship_Table**
Person_Id int (PK)
Country_Code char(2) (PK)
**Country_Table**
Country_Code char(2) (PK)
Country_Name varchar(30)
...
... возможно сопоставление вашей модели:
modelBuilder.Entity<Person>()
.Property(p => p.Id)
.HasColumnName("Person_Id");
modelBuilder.Entity<Person>()
.Property(p => p.Name)
.HasColumnName("First_Name")
.HasMaxLength(30);
modelBuilder.Entity<Person>()
.HasMany(p => p.Citizenships)
.WithMany()
.Map(a => {
a.MapLeftKey("Person_Id");
a.MapRightKey("Country_Code");
a.ToTable("Citizenship");
});
modelBuilder.Entity<Person>()
.HasOptional(p => p.PrimaryCitizenship) // or .HasRequired(...)
.WithMany()
.Map(a => a.MapKey("PrimaryCountry_Code"))
.WillCascadeOnDelete(false);
modelBuilder.Entity<Country>()
.HasKey(c => c.Code)
.Property(c => c.Code)
.HasColumnName("Country_Code")
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)
.HasMaxLength(2)
.IsFixedLength()
.IsUnicode(false);
modelBuilder.Entity<Country>()
.Property(c => c.Name)
.HasColumnName("Country_Name")
.HasMaxLength(30)
.IsUnicode(false);
Не решение вашей проблемы, а пища для обсуждения с вашим администратором базы данных.