实体框架 - 具有继承属性的实体

时间:2012-08-21 19:19:45

标签: c# .net entity-framework

我搜索了这里的帖子,发现了多个类似帖子,但没有解决方案

假设我的数据库中有一个用户表,我已映射到一个简单的用户实体

public class User{
    public int UserId {get;set;}
    public string Username {get;set;}
}

我想创建一个新类,它将封装一个ExternalUser,它具有与User相同的所有字段,但会添加更多字段。我的ExternalUser的字段将从db中的视图填充,该视图从User中提取字段以及ExternalUser所需的其他字段

public class ExternalUser : User{
    public int SomeExternalId{get;set;};
    public string SomeExternalProp{get;set;};
}

但无论我如何为这个新对象定义我的映射,我都会收到以下错误:

属性'UserId'不是'ExternalUser'类型的声明属性。使用Ignore方法或NotMappedAttribute数据批注验证是否未从模型中显式排除该属性。确保它是有效的原始属性。

有人可以分享正确的方式来映射这个。这样的东西让我讨厌EF,只是继承POCO不应该让它爆炸,特别是当我指向的底层视图中存在所有字段时。非常感谢!

3 个答案:

答案 0 :(得分:2)

在这里查看:http://weblogs.asp.net/manavi/archive/2010/12/24/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph.aspx和此处:http://www.codeproject.com/Articles/393228/Entity-Framework-Code-First-Inheritance-Table-Per

请记住,EF会将它们同时放在SAME表中,它将只包含它们都需要的所有字段,以及一个区分各个字段的“鉴别器”。

答案 1 :(得分:1)

以下是使用EF进行每种类型建模的表格的快速介绍:

答案 2 :(得分:0)

我不确定您的用例,但是如果您可以选择将User设为abstract的基础class,则可以使用Table per Concrete Type方法。 / p>

在为User创建模型映射时,您需要将abstract设为MapInheritedProperties()类并调用ExternalUser

public abstract class User
{
    public int UserId { get; set; }
    public string Username { get; set; }
}

[Table("ExternalUser")]
public class ExternalUser : User
{
    public int SomeExternalId { get; set; }
    public string SomeExternalProp { get; set; }
}

请注意,我正在使用[Table]属性将实体名称映射到表名称(您也可以在OnModelCreating方法中执行此操作,但是我发现使用{{1} }属性):

这是[Table]方法:

OnModelCreating

请注意,由于我不想使用复数表名,因此我正在删除protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); Database.SetInitializer<ApplicationDbContext>(new CreateDatabaseIfNotExists<ApplicationDbContext>()); modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); // I believe the inherited properties are mapped by default modelBuilder.Entity<ExternalUser>().Map(m => { m.MapInheritedProperties(); }); }