具有许多类型和派生类型的实体框架6

时间:2018-11-02 15:43:02

标签: c# entity-framework

如何在导航属性的集合中使用子类/派生类,并在Entity Framework 6中设置适当的约束?

考虑此模型:

// Base class
public abstract class Person 
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int WidgetId { get; set; }
    public virtual Widget Widget { get; set; }
}

// Child classes
public class Consumer : Person { ... }
public class Supplier : Person { ... }

// Compositing principal class
public class Widget 
{
    public int Id { get; set; }
    public virtual Supplier Supplier { get; set; }
    public virtual ICollection<Consumer> Consumers { get; set; }
}

小部件与Supplier具有一对一的关系,与Customer具有零对多的关系。

如何在考虑继承的情况下配置Consumer关系?

到目前为止我的尝试:

public class PersonSchema : EntityTypeConfiguration<Person> 
{
    public PersonSchema() 
    {
        ...
        HasRequired(p => p.Widget)
           .WithMany(w => w.Consumers) // INVALID CAST
           .HasForeignKey(p => p.WidgetId);
           ...
    } 
}

为简洁起见,我已经修剪了一些代码,但是我觉得这说明了问题出在哪里。

WithMany的问题在于,它的类型为ICollection<Consumer>,并且期望ICollection<Person>。而且你不能只是在它前面丢下一个演员。

1 个答案:

答案 0 :(得分:0)

似乎无法完成。我必须在Consumer和Supplier中显式创建WidgetId。一点点软糖就可以使EF正常工作。