Используя Entity Framework версии 4.0 (или любую другую версию, совместимую с .NET 4.0), я хочу сопоставить эту существующую схему реляционной базы данных:
к этой логической объектной модели:
который я попытался настроить следующим образом: (Надеюсь, немецкие подписи не будут слишком дезориентировать.)
Entity Framework дает мне эту ошибку:
Ошибка 3031: проблема с сопоставлением фрагментов…: ненулевой столбец
FooBs.B
в таблицеFooBs
сопоставляется со свойством объекта, допускающим значение NULL.
В логической модели B
должно быть обнуляемым. Однако в базе данных его нет, поскольку он находится в отдельной таблице. (Мне нравится избегать столбцов базы данных, допускающих значение NULL.) Он становится допустимым только при объединении Foos
и FooBs
(из-за кардинальности 1:0..1).
Как я могу исправить свое сопоставление, не изменяя ни схему базы данных, ни объектную модель?
P.S. Я также попробовал это сопоставление кода EF 6.0:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Foo>() .HasKey(f => f.Id) .Property(f => f.Id).HasColumnName("FooId").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); modelBuilder.Entity<Foo>().Map(f => { f.Property(_ => _.A); f.ToTable("Foos"); }).Map(f => { f.Property(_ => _.B); f.ToTable("FooBs"); }); }
Но и это не работает: при чтении из базы данных EF игнорирует все записи, для которых нет подзаписи в
FooBs
; при записи в базу данных он пытается вставитьNULL
вFooBs.B
для всехFoo
, для которых свойствоB
установлено наnull
.
partial class
) и это единственный ответ, который я получил, я приму ваш ответ. Большое спасибо за ваше предложение! 22.04.2014