带INNER JOIN的DbContext.Database.SqlQuery <t>不设置基类属性值

时间:2016-04-17 02:11:52

标签: c# entity-framework tsql dbcontext

拥有此EF代码的第一个实体分部类。

Dim MaxID As Integer = Convert.ToInt32(IIf(IsDBNull(cmd.ExecuteScalar()), 1, cmd.ExecuteScalar())

这部分延期。

public partial class Report
{
    public Guid ReportId { get; set; }
    public string Status { get; set; } 
    public DateTime SurveyDate { get; set; } 
}

SyncObject基类。

public partial class Report : SyncObject
{
    public override string ObjectId
    {
        get { return ReportId.ToString(); }
        set { ReportId = Guid.Parse(value); }
    }
}

在EF配置类中,我忽略了SyncObject属性,因为它们不是表的一部分。

public class SyncObject : ISyncObject
{
    public virtual string ObjectId { get; set; }
    public long VersionNumber { get; set; }
    public DateTime CreateDateTime { get; set; }
    public DateTime LastUpdateDateTime { get; set; }
    public bool IsDeleted { get; set; }
    public virtual string CorrelationId { get; set; }
}

我们有两个数据库表,Reports和SyncMetadata,SyncMetadata中没有外键,因此需要这种方式来简化数据库并支持具有不同PK数据类型的表。

我不关心EF上下文跟踪,因此我使用public partial class ReportConfiguration : EntityTypeConfiguration<Report> { public ReportConfiguration() : this("Wind") { } public ReportConfiguration(string schema) { ToTable(schema + ".Reports"); HasKey(x => x.ReportId); Property(x => x.ReportId).HasColumnName("ReportId").IsRequired().HasColumnType("uniqueidentifier").HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None); Property(x => x.Status).HasColumnName("Status").IsRequired().IsUnicode(false).HasColumnType("varchar").HasMaxLength(50); Property(x => x.SurveyDate).HasColumnName("SurveyDate").IsRequired().HasColumnType("date"); Ignore(x => x.CorrelationId); Ignore(x => x.ObjectId); Ignore(x => x.CreateDateTime); Ignore(x => x.IsDeleted); Ignore(x => x.LastUpdateDateTime); Ignore(x => x.VersionNumber); } }

查询在两个表之间进行连接并返回所有字段。

DbContext.Database.SqlQuery<T>("QUERY").ToListAsync()

SQL Server Management Studio可以很好地处理这个查询,我从表中加入了所有字段所需的记录,但问题是SqlQuery没有将SyncMetadata字段附加到SyncObject基类属性。

1 个答案:

答案 0 :(得分:1)

可能有多种可能的原因需要测试:

  1. 实体类型配置在执行SqlQuery时使用。
  2. 根据实体框架CodePlex,情况并非如此:http://entityframework.codeplex.com/workitem/233?PendingVoteId=233

      

    SqlQuery方法的设计不考虑任何映射,   包括使用属性应用的映射。它只是匹配   结果中的列名称与对象中的属性名称。   如果列名称不匹配,则需要使用列别名   (SQL Server中的AS关键字)重命名结果中的列。

    这适用于EF 6最新版本,正如它所述。

    1. 不处理SqlQuery方法的继承。
    2. 您可以尝试使用.SqlQuery而不是您的Domain类,而是使用继承的单独的类集,如果它工作正常,问题就在其他地方。如果效果很好,这可能是您使用的解决方案。

      您可以随时下载资源并对其进行分析以获得解决方案: http://entityframework.codeplex.com/SourceControl/latest 只需将其插入而不是NuGet包并逐步调试以查看错误发生的位置。

      我强烈建议尝试从SqlQuery获取DTO对象,因为这里会产生最少的副作用。对于非跟踪域实体查询,我建议使用带有.AsNoTracking()的Linq查询,如果它适用于您。