在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; }
}
}
你能告诉我什么是错的吗?
答案 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();
}
}
它创建的数据库: