2

我在使用实体框架代码优先方法时遇到问题:

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 对象?

提前致谢。

4

2 回答 2

3

这将不起作用,因为 EF 将您的继承理解为每个层次结构的表方案,因此它希望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();
}

检查复杂对象模型绑定规则的这个答案

祝你好运。

于 2013-04-12T15:01:40.440 回答
1

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

于 2013-04-12T15:04:53.260 回答