【问题标题】:How to get rid of model validation errors on entities that are not in my DBContext?如何摆脱不在我的 DBContext 中的实体的模型验证错误?
【发布时间】:2016-05-20 14:41:07
【问题描述】:

在我们的一个 .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 'tblPropertyValues' 在另一个大 DBContext 中声明,它使用相同的 DBConnection-String。但是我的 UnitTest 没有实例化另一个 DBContext。

我做错了什么?

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

【问题讨论】:

  • 您在使用 EDMX 设计器吗?我记得 EF4 的设计器有很多问题,并且在设计器中所做的更改通常没有正确反映在相关文件(CSDL 和 SSDL)中。我记得过去必须打开这些文件并手动修复一些与身份相关的设置。也许这就是问题所在,其中一个文件直到包含对该表的引用?

标签: c# entity-framework-4 dbcontext


【解决方案1】:

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

执行以下修复,您的课程将正常工作:

  1. 创建一个继承自 EntityTypeConfiguration 的类
  2. 将 EF 配置为忽略 tblPropertyValues 属性
  3. 在 DbContext OnModelCreating 事件中使用新的 Mapper 类

代码如下所示

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

【讨论】:

  • 不!问题不是 tblMyEntity 的映射,而是 tblPropertyValue 的映射,我的 DBContext 甚至没有使用或引用它。
  • 在映射中,告诉 EF 忽略此属性,EF 不会尝试解析该属性的映射 this.Ignore(t=>t.Property);
  • 我的上下文中没有引用的类的映射!所以我什么都说不出来!!!
猜你喜欢
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
  • 2016-06-13
  • 2011-02-26
  • 1970-01-01
  • 2019-01-04
  • 2019-05-04
  • 1970-01-01
相关资源
最近更新 更多