EF5 和 .NET 4.5 中的未映射错误
Posted
技术标签:
【中文标题】EF5 和 .NET 4.5 中的未映射错误【英文标题】:NotMapped Error in EF5 and .NET 4.5 【发布时间】:2012-09-11 03:14:26 【问题描述】:在 VS2012(.NET 4.5 和 Entity Framework 5)中
暴露继承关系时,导致编译时错误:
您不能对类型的属性“InnerString”使用忽略方法 'MrTree.SubSubClass' 因为这个类型继承自 映射此属性的“MrTree.BaseClass”。排除这个 模型中的属性,使用 NotMappedAttribute 或 Ignore 方法 基本类型。
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
namespace ConsoleApplication1
class Program
static void Main(string[] args)
MyDbcontext db = new MyDbcontext();
int i = db.SubSubClasses.Count();
public class BaseClass
[NotMapped]
public string InnerString get; set;
public class SubClass : BaseClass
public class SubSubClass : SubClass
public class MyDbcontext : DbContext
public DbSet<SubSubClass> SubSubClasses get; set;
public DbSet<SubClass> SubClasses get; set;
你能告诉我有什么问题吗?
【问题讨论】:
【参考方案1】:我找到了解决我自己经历过的这个问题的方法。我确实发布了一些关于可能导致问题的补充信息,但它被一些自负的书呆子删除了,他们认为这不值得。 所以这是我对这个问题的回答 - 可能不完全正确,但它对我有用,所以请不要删除这个书呆子先生,以防它帮助别人。
首先,此问题仅影响不直接使用 NotMapped 属性继承抽象类的类,而是影响从另一个类继承的类,该类本身继承自基类,根据原始声明。
使用类似于以下类设置的内容对我有用:
基类:
public abstract class EntityBase
public virtual int Id get; set; // this will be mapped
public virtual int DoNotMap get; set; // this should be ignored
一级继承
public class Contact : EntityBase
public string Name get; set;
二级继承
public class Employee : Contact
public DateTime StartDate get; set;
创建一个继承自 EntityTypeConfiguration 的通用配置类:
public class DataEntityBaseConfiguration<T>
: EntityTypeConfiguration<T> where T : EntityBase
public DataEntityBaseConfiguration()
Ignore(x => x.DoNotMap);
为直接从EntityBase类继承的所有第一级继承创建配置类,即:
public class ContactConfiguration : DataEntityBaseConfiguration<Contact>
// place any further configuration rules in the constructor
解决方法:任何从 EntityBase间接继承的类,只需创建一个从 EntityTypeConfiguration 继承的 Configuration 类:
public class EmployeeConfiguration : EntityTypeConfiguration<Employee>
// place any further configuration rules in the constructor
在您的 DataContext 中,在 OnModelCreating 方法中,添加您的配置:
modelBuilder.Configurations.Add(new ContactConfiguration()); modelBuilder.Configurations.Add(new EmployeeConfiguration());
假设在这种情况下采用 TPT 方法,将专用版本 Employee 映射到其自己的表,并与 Contact 具有 FK 关系:
modelBuilder.Entity<Contact>().Map<Employee>(m => m.ToTable("Employees"));
至少对我而言,这会创建一个没有“DoNotMap”属性的联系人表和一个没有“DoNotMap”表且与联系人有 PK/FK 关系的 Employee 表。即使我没有从 Employee Configuration 的 EntityBaseConfiguration 继承,它仍然以某种方式选择了 Ignore 并将其排除在外。 我假设如果我们采用 TPH 方法,我们最终会得到一个单独的 Contact 表和 Discriminator 列。 TPC 显然会重新创建 Employee 表中的所有 Contact 属性,但我不确定它是否还会创建 DoNotMap 属性 - 将在我有空的时候进行测试。
简而言之,回到最初的问题,我不确定为什么 NotMapped 属性和 Ignore 都会发生这种情况。当我的 EmployeeConfiguration 从 EntityBaseConfiguration 继承时出现错误。我不热衷于解决方法,因为首先错误在其声明中是错误的,其次,即使解决方案现在很简单,它也是一个很容易再次陷入的错误。
希望能帮助那些在继承问题上苦苦挣扎的人。
问候
【讨论】:
【参考方案2】:主键必须包含在 POCO 类定义 A 中的事实已经意味着 A 不是 POCO 对象。你不能忽略 POCO 对象的属性
【讨论】:
【参考方案3】:您的SubSubClass
中有一个名为InnerString
的属性吗?这就是错误的意思,尽管您的示例代码中没有列出它。
您上面的代码对我有用,但我必须添加一个 PK,这是整个控制台应用程序:
public class BaseClass
public int Id get; set;
[NotMapped]
public string InnerString get; set;
public class SubClass : BaseClass
public class SubSubClass : SubClass
public class MyDbcontext : DbContext
public DbSet<SubSubClass> SubSubClasses get; set;
public DbSet<SubClass> SubClasses get; set;
class Program
static void Main( string[] args )
var context = new MyDbcontext();
context.SubSubClasses.Add(new SubSubClass());
context.SaveChanges();
以及它创建的数据库:
【讨论】:
我提供的关于类定义的代码是完整的。我的开发环境是Visual Studio 2012,Entity Framework 5.0.0,目标框架是.net Framework 4.5.50709,你呢? 是的,设置相同。您是否像我一样添加了主键?以上是关于EF5 和 .NET 4.5 中的未映射错误的主要内容,如果未能解决你的问题,请参考以下文章
vb.net 4.5 中的 Zipfile “目录名无效。”错误 - 无法确定原因?
如何使用 Oracle 和 SQL Server 将 .NET 4.5 C# Entity Framework 6 中的列映射为大写?