C# 实体框架模型中的BaseEntity优先
首先,我对EF模型有一个小问题。我希望有一个通用实体不映射到任何数据库表。只有一个属性Int Id的实体。所有其他实体都应从此属性Int Id派生。(由于有了这个基类,我将能够创建非常通用的存储库) 我已经拥有了除该基之外的所有实体(到目前为止,每个实体都有自己的密钥属性) 当我尝试添加BaseEntity时,出现错误:C# 实体框架模型中的BaseEntity优先,c#,entity-framework,C#,Entity Framework,首先,我对EF模型有一个小问题。我希望有一个通用实体不映射到任何数据库表。只有一个属性Int Id的实体。所有其他实体都应从此属性Int Id派生。(由于有了这个基类,我将能够创建非常通用的存储库) 我已经拥有了除该基之外的所有实体(到目前为止,每个实体都有自己的密钥属性) 当我尝试添加BaseEntity时,出现错误: Problem in mapping fragments starting at line 614:Must specify mapping for all key prope
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是否设置为抽象
从该实体派生的任何其他实体再次出现相同的错误。
在代码优先中,这将非常简单,但我不知道如何使用Model First以一种好的方式完成它
我做错了什么?尝试使用FluentAPI覆盖此行为:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Ignore<MyBaseClass>();
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
Ignore();
}
这种方法也可能适用于您:尝试使用FluentAPI覆盖此行为:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Ignore<MyBaseClass>();
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
Ignore();
}
这种方法也可能适用于您:尝试使用FluentAPI覆盖此行为:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Ignore<MyBaseClass>();
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
Ignore();
}
这种方法也可能适用于您:尝试使用FluentAPI覆盖此行为:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Ignore<MyBaseClass>();
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
Ignore();
}
这种方法也可能适用于您:您可以在OnModelCreating方法中忽略它:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Ignore<BaseEntity>();
}
您可以在OnModelCreating方法中忽略它:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Ignore<BaseEntity>();
}
您可以在OnModelCreating方法中忽略它:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Ignore<BaseEntity>();
}
您可以在OnModelCreating方法中忽略它:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Ignore<BaseEntity>();
}
我相信你想要的是每个层次的表。可以找到实现它的教程 简而言之,在设计器中,需要执行以下步骤:
- 将BaseEntity设置为Abstract==true
- 将相关项设置为Abstract==false,并将其基类型设置为BaseEntity
- 将BaseEntity设置为Abstract==true
- 将相关项设置为Abstract==false,并将其基类型设置为BaseEntity
- 将BaseEntity设置为Abstract==true
- 将相关项设置为Abstract==false,并将其基类型设置为BaseEntity
- 将BaseEntity设置为Abstract==true
- 将相关项设置为Abstract==false,并将其基类型设置为BaseEntity
- 我用自己的方式做得很好。我修改了Model.tt并更改了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;
}
}
我用我自己的方式做了。我修改了Model.tt并更改了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;
}
}
我用我自己的方式做了。我修改了Model.tt并更改了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;
}
}
我用我自己的方式做了。我修改了Model.tt并更改了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;
}
}
FluentApi更倾向于代码优先(至少这是我想的)我应该把代码放在哪里?FluentApi更倾向于代码优先(至少这是我想的)我应该把代码放在哪里?FluentApi更倾向于代码优先(至少这是我想的)我应该把代码放在哪里?FluentApi更倾向于代码优先(至少我是这么想的)我应该把这段代码放在哪里?但是我使用了EDMX,所以从来没有调用过OnModelCreating。我想我需要使用T4模板做一点工作。但是我使用了EDMX,所以从来没有调用过OnModelCreating。我想我需要使用T4模板做一点工作。但是我使用了EDMX,所以从来没有调用过OnModelCreating。我想我需要使用T4模板做一点工作。但是我使用了EDMX所以从来没有调用过ModelCreating。我想我需要使用T4模板。