asp.net-mvc - 继承自实体类,因此可以在 Entity Framework 中使用

标签 asp.net-mvc entity-framework inheritance

我在使用 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/

相关文章:

c# - 忽略数据模型中的属性,同时将它们保留在 EF Core 迁移中

c++ - 具有不同数组实现的子类

asp.net-mvc - Azure 将 blob 下载到用户计算机

asp.net-mvc - 使用区域时,我可以将 system.web.webPages.razor 放在我的顶级 web.config 中吗?

c# - 在 MySQL 和 Entity Framework 中删除评论及其所有子项的 SQL 查询

c++ - 在 C++ 中,当继承一个类并覆盖一个函数时。从数组调用该重写函数时出现意外结果

java - 覆盖使用子类型的方法

c# - 使用 AJAX 加载部分 View 不起作用

asp.net-mvc - asp.net MVC : localization

c# - Entity Framework 代码优先外键问题