如何消除不在我的 DBContext 中的实体的模型验证错误?
How to get rid of model validation errors on entities that are not in my DBContext?
在我们的一个 .Net 应用程序中,我们有一个包含所有实体的大 DBContext。为了加快 DBContext 的实例化,我试图将 DBContext 分成更小的块。
我的 DBContext class 看起来像这样:
public class DALContext : DBContext
{
static DALContext()
{
Database.SetInitializer<DALContext>(null);
}
public DALContext(string connectionString)
: base(connectionString)
{
this.Configuration.ProxyCreationEnabled = false;
this.Configuration.LazyLoadingEnabled = false;
this.Configuration.AutoDetectChangesEnabled = true;
IObjectContextAdapter objectContextAdapter = this as IObjectContextAdapter;
if (objectContextAdapter.ObjectContext != null)
{
objectContextAdapter.ObjectContext.CommandTimeout = 300;
}
}
public DbSet<tblMyEntity> tblMyEntities { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new tblMyEntityMap());
}
}
尝试在 UnitTest 中初始化 DBContext 会导致以下错误并显示消息:
System.Data.Entity.Edm.EdmEntityType: : EntityType 'tblPropertyValue' has no key defined. Define the key for this EntityType.
System.Data.Entity.Edm.EdmEntitySet: EntityType: EntitySet 'tblPropertyValues' is based on type 'tblPropertyValue' that has no keys defined.
还有一个看起来像这样的堆栈跟踪:
bei System.Data.Entity.ModelConfiguration.Edm.EdmModelExtensions.ValidateAndSerializeCsdl(EdmModel model, XmlWriter writer)
bei System.Data.Entity.DbModelBuilder.Build(DbProviderManifest providerManifest, DbProviderInfo providerInfo)
bei System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection)
bei System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext)
bei System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input)
bei System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
bei System.Data.Entity.Internal.InternalContext.ForceOSpaceLoadingForKnownEntityTypes()
bei System.Data.Entity.DbContext.System.Data.Entity.Infrastructure.IObjectContextAdapter.get_ObjectContext()
bei DAL.DALContext..ctor(String connectionString)
我迷路的问题是,带有 class tblPropertyValue
的 DBSet 没有在我的 DBContext 中声明。
EntitySet 'tblPropertyValues' 在另一个大的 DBContext 中声明,它使用相同的 DBConnection-String。但是另一个 DBContext 没有被我的 UnitTest 实例化。
我做错了什么?
更新: 问题是由所有实体的基础 class 引起的,该实体有一个方法返回 [=14] 的所有子 classes =] WCF 的属性。
boutta,我真的很想帮助你。您看到的异常是一个非常常见的 EF 异常。它告诉您 EF 无法找出对象上所有属性的映射。您尚未向 EF 提供对象映射,因此它会尝试为您进行映射,但它做不到。解决您问题的方法是创建一个映射 class。参见 https://msdn.microsoft.com/en-us/data/jj591617.aspx
执行以下修复,您的 class 将起作用:
- 创建一个继承自 EntityTypeConfiguration
的 class
- 配置 EF 以忽略 tblPropertyValues 属性
- 在 DbContext OnModelCreating 事件中使用新的 Mapper class
代码如下所示
public class tblMyEntityMapper : EntityTypeConfiguration<tblMyEntityMap>
{
public tblMyEntityMapper()
{
this.Ignore(t => t. tblPropertyValues);
}
}
并将 DbContext 更改为此
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new tblMyEntityMapper());
}
EF 非常宽容,如果其他属性与列名匹配,它会自动映射它们。
在我们的一个 .Net 应用程序中,我们有一个包含所有实体的大 DBContext。为了加快 DBContext 的实例化,我试图将 DBContext 分成更小的块。
我的 DBContext class 看起来像这样:
public class DALContext : DBContext
{
static DALContext()
{
Database.SetInitializer<DALContext>(null);
}
public DALContext(string connectionString)
: base(connectionString)
{
this.Configuration.ProxyCreationEnabled = false;
this.Configuration.LazyLoadingEnabled = false;
this.Configuration.AutoDetectChangesEnabled = true;
IObjectContextAdapter objectContextAdapter = this as IObjectContextAdapter;
if (objectContextAdapter.ObjectContext != null)
{
objectContextAdapter.ObjectContext.CommandTimeout = 300;
}
}
public DbSet<tblMyEntity> tblMyEntities { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new tblMyEntityMap());
}
}
尝试在 UnitTest 中初始化 DBContext 会导致以下错误并显示消息:
System.Data.Entity.Edm.EdmEntityType: : EntityType 'tblPropertyValue' has no key defined. Define the key for this EntityType.
System.Data.Entity.Edm.EdmEntitySet: EntityType: EntitySet 'tblPropertyValues' is based on type 'tblPropertyValue' that has no keys defined.
还有一个看起来像这样的堆栈跟踪:
bei System.Data.Entity.ModelConfiguration.Edm.EdmModelExtensions.ValidateAndSerializeCsdl(EdmModel model, XmlWriter writer)
bei System.Data.Entity.DbModelBuilder.Build(DbProviderManifest providerManifest, DbProviderInfo providerInfo)
bei System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection)
bei System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext)
bei System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input)
bei System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
bei System.Data.Entity.Internal.InternalContext.ForceOSpaceLoadingForKnownEntityTypes()
bei System.Data.Entity.DbContext.System.Data.Entity.Infrastructure.IObjectContextAdapter.get_ObjectContext()
bei DAL.DALContext..ctor(String connectionString)
我迷路的问题是,带有 class tblPropertyValue
的 DBSet 没有在我的 DBContext 中声明。
EntitySet 'tblPropertyValues' 在另一个大的 DBContext 中声明,它使用相同的 DBConnection-String。但是另一个 DBContext 没有被我的 UnitTest 实例化。
我做错了什么?
更新: 问题是由所有实体的基础 class 引起的,该实体有一个方法返回 [=14] 的所有子 classes =] WCF 的属性。
boutta,我真的很想帮助你。您看到的异常是一个非常常见的 EF 异常。它告诉您 EF 无法找出对象上所有属性的映射。您尚未向 EF 提供对象映射,因此它会尝试为您进行映射,但它做不到。解决您问题的方法是创建一个映射 class。参见 https://msdn.microsoft.com/en-us/data/jj591617.aspx
执行以下修复,您的 class 将起作用:
- 创建一个继承自 EntityTypeConfiguration 的 class
- 配置 EF 以忽略 tblPropertyValues 属性
- 在 DbContext OnModelCreating 事件中使用新的 Mapper class
代码如下所示
public class tblMyEntityMapper : EntityTypeConfiguration<tblMyEntityMap>
{
public tblMyEntityMapper()
{
this.Ignore(t => t. tblPropertyValues);
}
}
并将 DbContext 更改为此
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new tblMyEntityMapper());
}
EF 非常宽容,如果其他属性与列名匹配,它会自动映射它们。