這是我的實現。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
}
這裏是數據庫模型:
現在在我的數據訪問層,當我取回的人,嘗試做訪問「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子類之間的關係。
幫助請。
感謝
沒有工作。還是一樣的錯誤。 System.Data.SqlClient.SqlException:無效的列名稱'Person_PersonID'。 列名'Person_PersonID'無效。 列名'Person_PersonID'無效。 – bipinkarms 2012-02-10 23:00:02
我更新了答案。 – hival 2012-02-11 16:46:25
這將返回不起作用的基類型。在Person中會有類似類型的其他集合,比如public virtual ICollection PersonExperience {get;設置;} –
bipinkarms
2012-02-13 15:13:49