如何摆脱不在我的DBContext中的实体的模型验证错误?

时间:2016-03-23 14:40:04

标签: c# entity-framework-4 dbcontext

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

我的DBContext类看起来像这样:

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) 

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

EntitySet&#39; tblPropertyValues&#39;在另一个大DBContext中声明,它使用相同的DBConnection-String。但是其他DBContext没有被我的UnitTest实例化。

我做错了什么?

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

1 个答案:

答案 0 :(得分:1)

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

执行以下操作以修复您的课程:

  1. 创建一个继承自EntityTypeConfiguration
  2. 的类
  3. 将EF配置为忽略tblPropertyValues属性
  4. 在DbContext OnModelCreating事件中使用新的Mapper类
  5. 代码看起来像这样

    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非常宽容,如果它们与列名匹配,它会自动映射其余属性。