首先是实体框架模型中的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是否被设置为抽象
从该实体派生的任何其他实体再次出现相同的错误。在代码第一,这将是非常简单的,但我不知道如何在一个很好的方式与模型第一。
我做错了什么?
尝试使用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;
}
}