EF5和.NET 4.5中的NotMapped错误

时间:2012-09-11 03:14:26

标签: c# code-first visual-studio-2012 .net-4.5 entity-framework-5

在VS2012(.NET 4.5和Entity Framework 5)中

当暴露继承关系时,导致编译时错误:

  

您不能在类型的属性'InnerString'上使用Ignore方法   '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; }

    }
}

你能告诉我什么是错的吗?

3 个答案:

答案 0 :(得分:1)

我找到了解决这个问题的工作,我亲身经历过这个问题。我确实发布了一些关于可能导致这个问题的补充信息,但是被一些认为不值得的自负式书呆子删除了。 所以这是我对这个问题的回答 - 可能不完全正确,但它对我有用,所以请不要删除这个Nerd先生,以防它帮助了其他人。

首先,此问题仅影响不使用NotMapped属性直接继承抽象类的类,而是根据原始语句从继承自基类的另一个类继承的类。

以下适用于我使用类似于以下类设置的内容:

BASE CLASS:

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映射到其自己的表格,并与联系人建立FK关系:

 modelBuilder.Entity<Contact>().Map<Employee>(m => m.ToTable("Employees"));

至少对我来说,这会创建一个没有“DoNotMap”属性的联系人表和一个没有“DoNotMap”表且与Contact有PK / FK关系的Employee表。即使我没有从Employity Configuration的EntityBaseConfiguration继承,它仍然以某种方式接收Ignore并将其遗漏。 我假设如果我们采用TPH方法,我们最终会得到一个Contact表和Discriminator列。 TPC显然会重新创建Employee表中的所有Contact属性,但我不确定它是否也会创建DoNotMap属性 - 当我有一个备用时刻时会测试它。

简而言之,回到最初的问题,我不确定为什么NotMapped属性和Ignore都会发生这种情况。当我的EmployeeConfiguration继承自EntityBaseConfiguration时,我收到错误。我并不热衷于解决方法,因为它首先在其语句中错误是错误的;其次,这是一个很容易再次陷入错误的错误,即使解决方案现在非常简单。

希望能帮助那些在继承问题上遇到困难的人。

此致

答案 1 :(得分:1)

主键必须包含在POCO类定义A中的事实已经意味着Ais不是POCO对象。您不能忽略POCO对象上的属性

答案 2 :(得分:0)

您的InnerString中是否有名为SubSubClass的媒体资源?这就是错误所说的内容,尽管您的示例代码中没有列出它。

上面的代码对我有用,但我必须添加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();
      }
   }

它创建的数据库:

enter image description here