首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何消除不在我的DBContext中的实体上的模型验证错误?

如何消除不在我的DBContext中的实体上的模型验证错误?
EN

Stack Overflow用户
提问于 2016-03-23 14:40:03
回答 1查看 542关注 0票数 0

在我们的一个.Net应用程序中,我们有一个包含所有实体的大DBContext。为了加速DBContext的实例化,我尝试将DBContext分解成更小的块。

我的DBContext类如下所示:

代码语言:javascript
复制
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());
    }

}

试图在DBContext中初始化UnitTest会导致以下错误:

代码语言:javascript
复制
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.

还有一个看起来像这样的堆栈:

代码语言:javascript
复制
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) 

我迷路的问题是,带有类DBSet的tblPropertyValue没有在我的DBContext中声明。

EntitySet 'tblPropertyValues‘在另一个大DBContext中声明,它使用相同的DBConnection-String。但是另一个DBContext不是由我的UnitTest实例化的。

我做错了什么?

更新:问题是由所有实体的基类引起的,其中有一个方法返回WCF的known-types属性的所有子类。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-23 14:53:59

我真的是想帮你。您看到的异常是一个非常常见的EF异常。它告诉您,EF无法计算对象上所有属性的映射。您没有为EF提供对象映射,因此它试图为您进行映射,但它不能。解决问题的方法是创建一个映射类。请参阅https://msdn.microsoft.com/en-us/data/jj591617.aspx

如果要修复以下内容,那么您的类就可以工作了:

  1. 创建从EntityTypeConfiguration继承的类
  2. 配置EF以忽略tblPropertyValues属性
  3. 在DbContext OnModelCreating事件中,使用新的Mapper类

代码将如下所示

代码语言:javascript
复制
public class tblMyEntityMapper : EntityTypeConfiguration<tblMyEntityMap>
{
       public tblMyEntityMapper()
       {
           this.Ignore(t => t. tblPropertyValues);
       }
}

并将DbContext更改为

代码语言:javascript
复制
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
        modelBuilder.Configurations.Add(new tblMyEntityMapper());
}

EF是非常宽容的,它将自动映射您的其他属性,如果它们匹配列名。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36181198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档