このEFコードの最初のエンティティの部分クラスです。DbContext.Database.SqlQuery INNER JOINを持つ<T>は、基本クラスのプロパティ値を設定しません。
public partial class Report
{
public Guid ReportId { get; set; }
public string Status { get; set; }
public DateTime SurveyDate { get; set; }
}
そして、この部分的な拡張です。
public partial class Report : SyncObject
{
public override string ObjectId
{
get { return ReportId.ToString(); }
set { ReportId = Guid.Parse(value); }
}
}
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; }
}
EF構成クラスでは、SyncObjectプロパティはテーブルの一部ではないため、無視されます。我々は2つのデータベースのテーブルを持っている
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);
}
}
、SyncMetadataで外部キーを使用したレポートとSyncMetadata、それは別のPKデータ型とDBのシンプルさとサポートのテーブルのためにこの方法を必要としています。
私はDbContext.Database.SqlQuery<T>("QUERY").ToListAsync()
を使用するので、EFコンテキストトラッキングは気にしません。
クエリは2つのテーブル間の結合を行い、すべてのフィールドを返します。
SELECT ReportId
,Status
,SurveyDate
,S.CorrelationId
,S.ObjectId
,S.VersionNumber
,S.CreateDateTime
,S.LastUpdateDateTime
,S.IsDeleted
FROM Reports R
INNER JOIN SyncMetadata S
ON R.ReportId=S.ObjectId
SQL Server Management Studioのは、このクエリで素晴らしい作品、私はテーブルから参加したすべてのフィールドで必要なレコードを取得するが、問題がのSQLQueryがSyncObject基本クラスにSyncMetadataフィールドを追加していないということですプロパティ。
Domainクラスではなく.SqlQueryを使用してみましたが、代わりに継承を持つクラスセットを別にしましたか?これは、クエリにReportConfigurationを使用できるように感じますが、私はこのアサーションを今すぐチェックすることはできません。 –
@raderickあなたは正しく、クラスをEFドメインエンティティから自分のデータ転送オブジェクトクラスに変更し、完璧に機能しました。アイデアをお寄せいただきありがとうございます。この場合、Automapperは必要ありません。回答を投稿すると解決済みとマークします。 –