我搜索了这里的帖子,发现了多个类似帖子,但没有解决方案
假设我的数据库中有一个用户表,我已映射到一个简单的用户实体
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不应该让它爆炸,特别是当我指向的底层视图中存在所有字段时。非常感谢!
答案 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();
});
}
。