【问题标题】:EF: TPH implementation with Fluent mapping throws Invalid Column Name exceptionEF:使用 Fluent 映射的 TPH 实现抛出 Invalid Column Name 异常
【发布时间】:2012-03-03 04:15:28
【问题描述】:

这是我的实现。

 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 之间的关系。

请帮忙。

谢谢

【问题讨论】:

    标签: entity-framework-4.1 fluent-interface table-per-hierarchy


    【解决方案1】:

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

    public int PersonID 
    { 
        get;
        set;
    } 
    

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

    【讨论】:

      【解决方案2】:

      试试这个

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

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

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

      【讨论】:

      • 没用。还是同样的错误。 System.Data.SqlClient.SqlException:列名“Person_PersonID”无效。列名“Person_PersonID”无效。列名“Person_PersonID”无效。
      • 这将返回不起作用的基本类型。 Person 中还会有其他类似类型的集合,例如 public virtual ICollection PersonExperience {get;设置;}
      猜你喜欢
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-20
      • 1970-01-01
      • 1970-01-01
      • 2014-07-22
      相关资源
      最近更新 更多