【问题标题】:Entity Framework code first foreign key select query issue实体框架代码第一个外键选择查询问题
【发布时间】:2013-03-27 07:16:31
【问题描述】:

我有一个 POCO,它的外键看起来像这样

public partial class DataFileInformation
{
    public DataFileInformation()
    {
    }

    public int ID { get; set; }
    public int? HistoryID { get; set; }
    public string FileName { get; set; }
    public int NumberOfLines { get; set; }
    public string UpdatedByPersonnelNumber { get; set; }
    public DateTime UpdatedDateTime { get; set; }    
    public virtual JobHistory History { get; set; }
}

public partial class JobHistory
{    
    public int ID { get; set; }
    public Nullable<DateTime> StartDate { get; set; }
    public Nullable<DateTime> EndDate { get; set; }
    public Nullable<DateTime> UpdatedDateTime { get; set; }    
}

映射:

class DataFileUploadInformationEntityMap : EntityTypeConfiguration<DataFileInformation>
{
    public DataFileUploadInformationEntityMap ()
    {
        ToTable("DataFileInformationsView");
        HasKey(fileMetaData => fileMetaData.ID);
        HasOptional(file => file.History)
            .WithMany().HasForeignKey(file => file.HistoryID);
    }
}

public class JobHistoryEntityMap : EntityTypeConfiguration<JobHistory>
{
    public JobHistoryEntityMap()
    {
        ToTable("JobHistoryView");
        HasKey(job => job.ID);
    }
}

即使使用配置,触发的动态查询看起来像这样

exec sp_executesql N'SELECT  
    [Extent1].[ID] AS [ID],
    [Extent1].[DataFileInformation_ID] AS [DataFileInformation_ID], 
    [Extent1].[FileName] AS [FileName], 
    [Extent1].[UpdatedByPersonnelNumber] AS [UpdatedByPersonnelNumber],
    [Extent1].[UpdatedDateTime] AS [UpdatedDateTime],
    [Extent1].[JobID] AS [LoaderJobID],
    [Extent1].[JobHistory_ID] AS [JobHistory_ID],
    [Extent2].[ID] AS [ID1],
    [Extent2].[StartDate] AS [StartDate],
    [Extent2].[EndDate] AS [EndDate],
    [Extent2].[UpdatedByPersonnelNumber] AS [UpdatedByPersonnelNumber1],
    [Extent2].[CreateDate] AS [CreateDate],
    FROM   [DataFileInformationsView] AS [Extent1]
    LEFT OUTER JOIN [JobHistoryView] AS [Extent2] 
        ON [Extent1].[LoaderJobID] = [Extent2].[ID] 
    WHERE [Extent1].[ID] = @p__linq__0',N'@p__linq__0 int',@p__linq__0=146

生成的动态查询无法将 JobHistory_ID 和 DataFileInformation_ID 映射到 POCO,EF 抛出无法找到列的异常

【问题讨论】:

    标签: entity-framework c#-4.0 entity-framework-4.1


    【解决方案1】:

    DataFileInformation 映射的类名不正确,可选外键的属性名不正确:

    class FileUploadInformationEntityMap :
        EntityTypeConfiguration<DataFileInformation>
    {
        public FileUploadInformationEntityMap()
        {
            ToTable("DataFileUploadInformationEntity");
            HasKey(f => f.ID);
            HasOptional(f => f.History); // here you have LoaderJobHistory
        }
    }
    

    还要确保您正在查看正确的 SQL,因为从 SQL 我看到名称 DataFileInformationsViewJobHistoryView,但映射提供了表名称 DataFileUploadInformationEntityJobHistoryEntity。而且您不需要指定HasOptional - 默认情况下,FK 可以为空。


    更新问题后,您的映射应该可以工作。您也可以添加级联删除配置(但这不是必需的)

    HasOptional(f => f.History)
        .WithMany()
        .HasForeignKey(f => f.HistoryID)
        .WillCascadeOnDelete(false);
    

    【讨论】:

    • 对不起,我写错了代码。我已经对其进行了编辑以显示问题
    • 我尝试删除 FK,但仍然抛出相同的异常。我还缺少其他东西吗
    • @user761728 写问题时要小心。现在你的代码对我来说很好用。它生成带有HistoryID (FK, int, null) 列的表。顺便说一句,您从哪里获得“动态”查询?
    猜你喜欢
    • 2015-02-24
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    相关资源
    最近更新 更多