1

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

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

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

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

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

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

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

有人可以分享映射这个的正确方法。像这样的东西让我讨厌 EF,简单地继承 POCO 不应该导致它爆炸,尤其是当所有字段都存在于我所指向的基础视图中时。非常感谢!

4

1 回答 1

0

我不确定您的用例,但如果您可以选择制作base ,那么您可以使用UserTable per Concrete Type方法。abstractclass

创建模型映射时,您需要创建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方法中执行此操作,但我发现使用[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();
    });
}

请注意,我正在删除PluralizingTableNameConvention,因为我不想要复数表名。

于 2020-09-09T07:43:06.947 回答