1

这是我的实现。

 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 图

现在在我的数据访问层中,当我检索人员并尝试访问“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 之间的关系。

请帮忙。

谢谢

4

2 回答 2

0

尝试这个

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

将您的集合修改为基本类型

public virtual ICollection<PersonCredential> PersonExpirableCredentials
{
    get;
    set;
} 
于 2012-02-10T18:06:21.867 回答
0

您必须将 getter 和 setter 都设置PersonID为 public。

public int PersonID 
{ 
    get;
    set;
} 

您已将 setter 设置为受保护的几个地方。也将它们更改为公开。

于 2012-02-11T10:18:51.193 回答