拥有此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基类属性。
答案 0 :(得分:1)
可能有多种可能的原因需要测试:
根据实体框架CodePlex,情况并非如此:http://entityframework.codeplex.com/workitem/233?PendingVoteId=233。
SqlQuery方法的设计不考虑任何映射, 包括使用属性应用的映射。它只是匹配 结果中的列名称与对象中的属性名称。 如果列名称不匹配,则需要使用列别名 (SQL Server中的AS关键字)重命名结果中的列。
这适用于EF 6最新版本,正如它所述。
您可以尝试使用.SqlQuery而不是您的Domain类,而是使用继承的单独的类集,如果它工作正常,问题就在其他地方。如果效果很好,这可能是您使用的解决方案。
您可以随时下载资源并对其进行分析以获得解决方案: http://entityframework.codeplex.com/SourceControl/latest 只需将其插入而不是NuGet包并逐步调试以查看错误发生的位置。
我强烈建议尝试从SqlQuery获取DTO对象,因为这里会产生最少的副作用。对于非跟踪域实体查询,我建议使用带有.AsNoTracking()的Linq查询,如果它适用于您。