首先是实体框架模型中的BaseEntity

本文关键字:BaseEntity 模型 框架 实体 | 更新日期: 2023-09-27 18:14:15

我有一个小问题EF模型第一。我想要一个通用实体不映射到任何数据库表。只有一个属性Int Id的实体。所有其他的实体都是从这个衍生出来的。(多亏了这个基类,我将能够制作非常通用的存储库)。

我已经有了所有的实体,除了基础(到目前为止,每个实体都有自己的密钥属性)。

当我尝试添加我的BaseEntity我得到错误:

Problem in mapping fragments starting at line 614:Must specify mapping for all key properties (BaseEntities.Id) of the EntitySet BaseEntities.
...'DataAccess'Model.edmx

无论BaseEntity是否被设置为抽象

从该实体派生的任何其他实体再次出现相同的错误。在代码第一,这将是非常简单的,但我不知道如何在一个很好的方式与模型第一。

我做错了什么?

首先是实体框架模型中的BaseEntity

尝试使用FluentAPI:

重写此行为
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Ignore<MyBaseClass>();
}

也可能这种方法对你有用:首先在实体框架5代码中完全忽略基类/接口

您可以在OnModelCreating方法中忽略它:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Ignore<BaseEntity>();
}

或者如果您首先使用代码,则将[NotMapped]属性添加到类中:

[NotMapped]
public class BaseEntity
{
    public int Id { get; set; }
}

我相信你想要的是按层次表。可以在这里找到实现它的教程。

简而言之,在设计器中,以下步骤是必要的:

  • 设置BaseEntity为Abstract == true
  • 将相关项设置为Abstract == false,其基本类型为BaseEntity

我用自己的方式做到了。我已经修改了模型。修改了2个函数

public string EntityClassOpening(EntityType entity)
    {
        return string.Format(
            CultureInfo.InvariantCulture,
            "{0} {1}partial class {2}{3}",
            Accessibility.ForType(entity),
            _code.SpaceAfter(_code.AbstractOption(entity)),
            _code.Escape(entity),
            _code.StringBefore(" : ", "BaseEntity"));
 public string Property(EdmProperty edmProperty)
    {
        if (edmProperty.Name != "Id")
        {
            return string.Format(
                CultureInfo.InvariantCulture,
                "{0} {1} {2} {{ {3}get; {4}set; }}",
                Accessibility.ForProperty(edmProperty),
                _typeMapper.GetTypeName(edmProperty.TypeUsage),
                _code.Escape(edmProperty),
                _code.SpaceAfter(Accessibility.ForGetter(edmProperty)),
                _code.SpaceAfter(Accessibility.ForSetter(edmProperty)));
        }
        else
        {
            return String.Empty;
        }
    }