我遇到了实体框架代码优先方法的问题:
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对象?
提前致谢。
答案 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)
更好的方法是使用组合而不是继承。在这种情况下,视图模型可以将模型直接暴露给视图,也可以委托给模型。