コードの最初とデータアノテーションを使用してデータベースのプロジェクトを作成しようとしていますが、アーキテクチャに関する疑問があります。私の関係のスキーマが意味をなさないか、SQLで正しいのか、EFで実装できるのかはわかりません。 1つの子テーブルから2つのパラレルテーブルの1つに条件付きの関係を作成する方法。 私のProcessRelationテーブルでは、私は両方の関係を保存します。 JobBusinessArea - 見積もりとjobBussinesArea - PriceList。私はそれが気になることを願っています。助けと提案をありがとう。Entity Framework - 条件付きの関係 - 子テーブルを1つまたは他のパラレルテーブルに変換する
[Table("ProcessRelation")]
public class ProcessRelation
{
[Key, Column("AreaId", Order = 0)]
public int AreaId { get; set; }
[Key, Column("ModId", Order = 1)]
public int ModId { get; set; }
[Key, Column("PriceSourceTypeId", Order = 2)]
public int PriceSourceTypeId { get; set; }
public int CrtUsrnm { get; set; }
public DateTime CrtTmstmp { get; set; }
public int LcUsrnm { get; set; }
public DateTime LcTmstmp { get; set; }
[ForeignKey("PriceSourceTypeId")]
public virtual BillingProjectCode PriceSourceTypeCode { get; set; }
[ForeignKey("AreaId")]
public virtual JobBusinessArea JobBusinessArea { get; set; }
//TODO:
//Depending on the PriceSourceTypeId i would like create reference to PriceListProcessMod Table
//or EstimateProcessMod Table
//[ForeignKey("ModId")]
//public virtual PriceListProcessMod PriceListProcessMod { get; set; }
// or
//public virtual EstimateProcessMod EstimateProcessMod { get; set; }
}
[Table("PriceListProcessMod")]
public class PriceListProcessMod
{
[Key, Column("ModId", Order = 0)]
public int ModId { get; set; }
public int ProcessId { get; set; }
public int Quantity { get; set; }
public bool IsIncluded { get; set; }
public int CrtUsrnm { get; set; }
public DateTime CrtTmstmp { get; set; }
public int LcUsrnm { get; set; }
public DateTime LcTmstmp { get; set; }
public decimal? CommisionPercentage { get; set; }
public bool? IsProportionalyFixed { get; set; }
[ForeignKey("ProcessId")]
public virtual PriceListProcess PriceListProcess { get; set; }
}
[Table("EstimateProcessMod")]
public class EstimateProcessMod
{
[Key, Column("ModId", Order = 0)]
public int ModId { get; set; }
public int? SplitId { get; set; }
public int ProcessId { get; set; }
public int Quantity { get; set; }
public bool IsIncluded { get; set; }
public int CrtUsrnm { get; set; }
public DateTime CrtTmstmp { get; set; }
public int LcUsrnm { get; set; }
public DateTime LcTmstmp { get; set; }
public decimal? CommisionPercentage { get; set; }
public bool? IsProportionalyFixed { get; set; }
[ForeignKey("ProcessId")]
public virtual EstimateProcess EstimateProcess{ get; set; }
}
[Table("JobBusinessArea")]
public class JobBusinessArea
{
[Key, Column("JobBusinessAreaId", Order = 0)]
public int JobBusinessAreaId { get; set; }
public int CrtUsrnm { get; set; }
public DateTime CrtTmstmp { get; set; }
public int LcUsrnm { get; set; }
public DateTime LcTmstmp { get; set; }
public int ProjectId { get; set; }
public int AreaTypeId { get; set; }
public int SourceId { get; set; }
}
SQLには条件付きリレーションシップがありません。その場合はEFはありません。 FK列は、正確に1つのターゲットPK列を対象とします。あなたの場合は、null可能なナビゲーションプロパティ/ FKを使用してください。可能であれば、TPH継承とペアにしてください。 – DevilSuichiro