EF: реализация TPH с бросками отображения Fluent Исключение Invalid Column Name - PullRequest
1 голос
/ 10 февраля 2012

Вот моя реализация.

 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.PersonExpurableCredentials».Выдает ошибку с неверным именем столбца «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 и подклассом PersonExpurableCredentials.

Помогите, пожалуйста.

Спасибо

Ответы [ 2 ]

0 голосов
/ 11 февраля 2012

Вы должны установить и геттер, и сеттер PersonID на общедоступные.

public int PersonID 
{ 
    get;
    set;
} 

Есть несколько мест, где вы установили защищенный сеттер.Измените их на общедоступные.

0 голосов
/ 10 февраля 2012

Попробуйте это

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

Измените свою коллекцию, чтобы она была базового типа

public virtual ICollection<PersonCredential> PersonExpirableCredentials
{
    get;
    set;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...