2

在VS2012(.NET 4.5和Entity Framework 5)NotMapped錯誤和.NET 4.5

當暴露的繼承關係,導致編譯時錯誤:

不能使用忽略方法在類型 'MrTree.SubSubClass'上的屬性'InnerString'上,因爲此類型繼承自映射此屬性的類型 '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

你在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(); 
     } 
    } 

它創建的數據庫:

enter image description here

+0

我提供的關於代碼的類定義已完成。我的開發環境是Visual Studio 2012,Entity Framework 5.0.0,目標框架是.NET Framework 4.5.50709,是嗎? – user1661673

+0

是的,這是相同的設置。你像我一樣添加主鍵嗎? –

1

我發現爲我遇到的這個問題找到解決方法。我確實發佈了一些關於可能導致問題的補充信息,但它被一些自認爲不值得的自負的書呆子刪除了。 所以這裏是我對這個問題的回答 - 可能不完全正確,但對我有用,所以請不要刪除這個Mr Nerd,以防萬一它幫助別人。

首先,這個問題隻影響不直接使用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繼承:

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的做法,與FK關係映射的專用版本,員工對自己的表聯繫方式:

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

此,至少對我來說,創建一個聯繫人表沒有「 DoNotMap「屬性和一個沒有」DoNotMap「表的」僱員「表以及與聯繫人的PK/FK關係。儘管我沒有從EntityBaseConfiguration for Employee Configuration繼承,但它仍然以某種方式獲取Ignore並將其忽略。 我會假設如果我們採用TPH方法,我們只需要一個Contact表加上Discriminator列。 TPC顯然會重新創建Employee表中的所有聯繫人屬性,但我不確定它是否也會創建DoNotMap屬性 - 將在我有空閒時測試該屬性。

總之,回到原來的問題,我不知道爲什麼這會發生與NotMapped屬性和忽略。當我的EmployeeConfiguration從EntityBaseConfiguration繼承時出現錯誤。我並不熱衷於這種解決方法,因爲它首先在其聲明中錯誤是錯誤的,其次,即使解決方案現在非常簡單,它也很容易陷入錯誤中。

希望能夠幫助任何人解決這個繼承問題。

問候

1

主鍵必須被包括在POCO類定義中的,這一事實已經意味着AIS不是POCO對象。您不能忽略POCO對象的屬性