2014-09-03 2 views
1

Обновление: Я должен был заметить, что свойство Id на NavigationPropertyClass не создано в базе данных. В моей фактической модели NavigationPropertyClass также является частью схемы иерархии (с использованием TPH), которая здесь не показана, а в то время как NavigationPropertyClass имеет экземпляр DerivedClass1 и набор из DerivedClass2 экземпляров, это не обязательно в случае всех классов, которые наследуют от базовый класс, из которого получается NavigationPropertyClass.Структура сущностей 6.1: 1-1 и отношение 1-много в производных типах и идентифицирующие отношения


Часть моей модели выглядит примерно так (другие свойства и конструкторы для краткости опускаем):

//Many other classes inherit from this class 
//and many of the derived classes are not composed of DerivedClass1 or DerivedClass2 
public abstract SomeOtherBaseClass{ 
    public int Id {get; set;} //not database generated, set in the constructor 
} 

public NavigationPropertyClass: SomeOtherBaseClass{ 
    public DerivedClass1 Derived1 {get; set;} 
    public virtual ICollection<DerivedClass2> Derived2Collection {get; set;} 
} 

public abstract class BaseClass{ 
    public int Id {get; set;} 
    //other properties shared by derived classes 
} 

public class DerivedClass1: BaseClass{ 
    public NavigationPropertyClass NavigationProperty {get; set;} 
    //other properties pertinent to DerivedClass1 
} 


public class DerivedClass2: BaseClass{ 
    public NavigationPropertyClass NavigationProperty {get; set;} 
    //other properties pertinent to DerivedClass2 
} 

DerivedClass1 имеет 1-1 отношения с NavigationPropertyClass, в то время как DerivedClass2 имеет много-1 отношения с NavigationPropertyClass.

Я пытаюсь установить идентификационные отношения в каждом из производных классов, так что, когда экземпляр NavigationPropertyClass будет удален из базы данных, также будет связан соответствующий экземпляр DerivedClass1 и любые экземпляры DerivedClass2. Единственный способ, которым я могу это понять, - это наследование TPT, но даже в этом случае я не могу нормально работать. Я бы опубликовал свою конфигурацию Fluent API, но на данный момент я пробовал так много перестановок, что не знаю, какой из них следует публиковать.

Есть ли способ сделать то, что я пытаюсь сделать? Если да, то как выглядит API Fluent API?

+0

_while Derived2 имеет отношения 1-много с NavigationPropertyClass_ => В One Derived2 есть много NavigationPropertyClass? –

+0

@YuliamChandra отредактирован, чтобы правильно определить направление отношений. – joelmdev

+0

EF не должен знать 'Base', вы можете сопоставить производные классы как независимые объекты. –

ответ

0

Это модели, соответствующие вашим требованиям.

public abstract class Base 
{ 
    public int Id { get; set; } 
} 
public class Derived1 : Base 
{ 
    public int PropDerived1 { get; set; } 
    public NavigationPropertyClass NavigationProperty { get; set; } 
} 
public class Derived2 : Base 
{ 
    public int PropDerived2 { get; set; } 

    public int NavigationPropertyClassId { get; set; } 
    public NavigationPropertyClass NavigationPropertyClass { get; set; } 
} 
public abstract class SomeOtherBaseClass 
{ 
    public int Id { get; set; } 
} 
public class NavigationPropertyClass : SomeOtherBaseClass 
{ 
    public Derived1 Derived1 { get; set; } 
    public virtual ICollection<Derived2> Derived2s { get; set; } 
} 

И вам нужно только использовать ToTable иметь наследование ТРТ при настройке модели строитель.

public class AppContext : DbContext 
{ 
    public DbSet<SomeOtherBaseClass> SomeOtherBaseClasses { get; set; } 
    public DbSet<Base> Bases { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Derived1>().ToTable("Derived1"); 
     modelBuilder.Entity<Derived2>().ToTable("Derived2"); 
     modelBuilder.Entity<NavigationPropertyClass>().ToTable("NavigationPropertyClass"); 

     modelBuilder.Entity<NavigationPropertyClass>() 
      .HasRequired(x => x.Derived1) 
      .WithRequiredDependent(x => x.NavigationProperty); 
    } 
} 

И оставить все EF convention, за исключением той части, где NavigationPropertyClass::Id также является FK для Derived1.

Результат

Result

Упрощенная генерируется ограничение на NavigationPropertyClass таблице:

PRIMARY KEY [Id] 
FOREIGN KEY([Id]) REFERENCES [dbo].[Derived1] ([Id]) 
FOREIGN KEY([Id]) REFERENCES [dbo].[SomeOtherBaseClasses] ([Id]) 

Подробнее

+0

Похоже, что я, возможно, упростил мою модель, поскольку Id на NavigationPropertyClass не является столбцом идентификации, и поэтому NavigationPropertyClass является основным концом отношения. Я уточню свой вопрос. – joelmdev

+0

Вопрос обновлен – joelmdev

+2

@joelmdev, я обновил ответ на основе вашего обновленного вопроса –

Смежные вопросы