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

PersonIDの getter と setter の両方を publicに設定する必要があります。

public int PersonID 
{ 
    get;
    set;
} 

セッターを保護した場所がいくつかあります。それらもパブリックに変更します。

于 2012-02-11T10:18:51.193 に答える