1

這是我的實現。EF:使用Fluent映射的TPH實現拋出無效的列名異常

public partial class Person 
{ 
    #region Constructors 

    public Person() 
    {    
     PersonExpirableCredentials = new List<personexpirablecredential>(); 
    } 

    #endregion Constructors 

    #region Properties 

    public int PersonID 
    { 
     get; 
     protected set; 
    } 

    public virtual ICollection<personexpirablecredential> PersonExpirableCredentials 
    { 
     get; 
     set; 
    }   

    #endregion 
} 

public abstract class PersonCredential 
{ 
    #region Constructors 

    public PersonCredential() 
    { 
    } 

    #endregion 

    #region Properties 

    public int PersonID 
    { 
     get; 
     protected set; 
    } 

    public int PersonCredentialID 
    { 
     get; 
     protected set; 
    }  

    public System.DateTime WhenEffective 
    { 
     get; 
     set; 
    } 

    public Nullable<system.datetime> WhenExpire 
    { 
     get; 
     set; 
    } 

    public virtual Person Person 
    { 
     get; 
     set; 
    } 
} 

public partial class PersonExpirableCredential : PersonCredential 
{ 
    #region Constructors 

    public PersonExpirableCredential() : 
     base() 
    { 
    } 

    #endregion 

    #region Properties 

    public DateTime? WhenCompleted 
    { 
     get; 
     set; 
    } 

    public string CredentialNumber 
    { 
     get; 
     set; 
    } 

    #endregion 
} 

下面是一口流利的映射

internal partial class PersonMapping : EntityTypeConfiguration<person> 
{ 
    #region Constructors 

    public PersonMapping() 
    { 
     this.HasKey(t => t.PersonID);  
     this.ToTable("Person"); 
    } 

    #endregion 
} 

internal partial class PersonCredentialMapping : EntityTypeConfiguration<personcredential> 
{ 
    #region Constructors 

    public PersonCredentialMapping() 
    { 
     this.HasKey(t => new { t.PersonCredentialID }); 
     this.ToTable("PersonCredential"); 
     this.HasRequired(t => t.Person).WithMany().HasForeignKey(d => d.PersonID);   
    } 

    #endregion 
} 

internal partial class PersonExpirableCredentialMapping : EntityTypeConfiguration<personexpirablecredential> 
{ 
    #region Constructors 

    public PersonExpirableCredentialMapping() 
    { 
     this.Map(m => 
     { 
      m.Requires("CredentialCategoryCode").HasValue("Expirable"); 
     }); 
     this.ToTable("PersonCredential"); 
    } 

    #endregion 
} 

這裏是數據庫模型:

TPH Diagram

現在在我的數據訪問層,當我取回的人,嘗試做訪問「Person.PersonExpirableCredentials」。它引發無效列名「Person_PersonID」的錯誤。下面是它生成的SQL查詢。

exec sp_executesql N'SELECT 
[Extent1].[PersonID] AS [PersonID], 
''1X0X'' AS [C1], 
[Extent1].[PersonCredentialID] AS [PersonCredentialID], 
[Extent1].[WhenEffective] AS [WhenEffective], 
[Extent1].[WhenExpire] AS [WhenExpire], 
[Extent1].[WhenCompleted] AS [WhenCompleted], 
[Extent1].[CredentialNumber] AS [CredentialNumber], 
[Extent1].[Person_PersonID] AS [Person_PersonID] 
FROM [dbo].[PersonCredential] AS [Extent1] 
WHERE ([Extent1].[Person_PersonID] IS NOT NULL) AND ([Extent1].[Person_PersonID] = @EntityKeyValue1) AND ([Extent1].[CredentialCategoryCode] = ''Expirable'')',N'@EntityKeyValue1 int',@EntityKeyValue1=3 

由於某些原因,EF無法識別Person類和PersonExpirableCredentials子類之間的關係。

幫助請。

感謝

回答

0

試試這個

this.HasRequired(t => t.Person).WithMany(p => p.PersonExpirableCredentials).HasForeignKey(d => d.PersonID);   

修改您的收藏是基本類型的

public virtual ICollection<PersonCredential> PersonExpirableCredentials 
{ 
    get; 
    set; 
} 
+0

沒有工作。還是一樣的錯誤。 System.Data.SqlClient.SqlException:無效的列名稱'Person_PersonID'。 列名'Person_PersonID'無效。 列名'Person_PersonID'無效。 – bipinkarms 2012-02-10 23:00:02

+0

我更新了答案。 – hival 2012-02-11 16:46:25

+0

這將返回不起作用的基類型。在Person中會有類似類型的其他集合,比如public virtual ICollection PersonExperience {get;設置;} – bipinkarms 2012-02-13 15:13:49

0

您必須PersonID的getter和setter方法設置爲公開。

public int PersonID 
{ 
    get; 
    set; 
} 

有幾個地方設置了setter保護。將這些更改爲公開。

+0

我改爲公開。仍然得到相同的錯誤。 – bipinkarms 2012-02-13 00:44:17