我在使用 Entity Framework 代码优先方法时遇到问题:
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 Framework 的设置。有用。我可以创建一个实体实例并将其添加到实体集中。现在我的问题是:我想创建一个 Entity 的子类,它是传递给某个 View 的 ViewModel:
public class EntityViewModel : Entity
{
public String ViewModelProperty { get; set; }
}
然后,当我从模型绑定(bind)器取回结果对象时,我应该能够执行以下操作:
public void Action(EntityViewModel vm)
{
db.Entities.Add(vm); // This should work since EntityViewModel inherits Entity
db.SaveChanges();
}
在这里,我得到以下异常:
Mapping and metadata information could not be found for EntityType 'EntityViewModel'.
我已经尝试将 [NotMapped] 属性添加到 EntityViewModel,但这没有帮助。 如果我手动将 EntityViewModel 属性提取到新的实体对象中,它就会起作用:
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 对象?
提前致谢。
最佳答案
这不会起作用,因为 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用于复杂对象模型绑定(bind)规则。
祝你好运。
关于asp.net-mvc - 继承自实体类,因此可以在 Entity Framework 中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15974188/