从Entity类继承,以便可以在Entity Framework中使用它

时间:2013-04-12 14:36:43

标签: asp.net-mvc entity-framework inheritance

我遇到了实体框架代码优先方法的问题:

public class Entity
{
    [Key]
    public int Id { get; set; }
    public string A { get; set; }
}

public class Context : DbContext
{
    public DbSet<Entity> Entities { get; set; }
}

假设这是实体框架的设置。有用。我可以创建一个Entity实例并将其添加到实体集。现在我的问题是:我想创建一个实体的子类,它是传递给某个视图的ViewModel:

public class EntityViewModel : Entity
{
    public String ViewModelProperty { get; set; }
}

然后,当我从模型绑定器返回结果对象时,我应该能够这样做:

public void Action(EntityViewModel vm)
{
    db.Entities.Add(vm); // This should work since EntityViewModel inherits Entity
    db.SaveChanges();
}

在这里,我得到以下例外:

  

无法找到EntityType'EntityViewModel'的映射和元数​​据信息。

我已经尝试将[NotMapped]属性添加到EntityViewModel,这没有帮助。 如果我手动将EntityViewModel属性提取到新的Entity对象中,它可以工作:

public void Action(EntityViewModel vm)
{
    var entity = new Entity
    {
        Id = vm.Id,
        A = vm.A
    };
    db.Entities.Add(entity); // This works!!!
    db.SaveChanges();
}

为什么EntityFramework会以这种方式运行?有没有办法告诉它忽略EntityViewModel对象?

提前致谢。

2 个答案:

答案 0 :(得分:2)

这不起作用,因为EF将您的继承理解为Table per Hierarchy方案,因此它希望EntityViewModel的属性与Entity的属性在同一个表中。

您可以使用合成来避免此问题:

public class EntityViewModel : Entity
{
    public Entity Entity { get; set; } 
    public String ViewModelProperty { get; set; }
}

然后

public void Action(EntityViewModel vm)
{
    db.Entities.Add(vm.Entity);
    db.SaveChanges();
}

检查this answer复杂对象模型绑定规则。

祝你好运。

答案 1 :(得分:1)

更好的方法是使用组合而不是继承。在这种情况下,视图模型可以将模型直接暴露给视图,也可以委托给模型。