2017-12-28 15 views
0

コードの最初とデータアノテーションを使用してデータベースのプロジェクトを作成しようとしていますが、アーキテクチャに関する疑問があります。私の関係のスキーマが意味をなさないか、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; } 

    } 
+0

SQLには条件付きリレーションシップがありません。その場合はEFはありません。 FK列は、正確に1つのターゲットPK列を対象とします。あなたの場合は、null可能なナビゲーションプロパティ/ FKを使用してください。可能であれば、TPH継承とペアにしてください。 – DevilSuichiro

答えて

0

EstimateProcessModとPriceListProcessModは共通点が多いようです。私はそれを利用して両方のエンティティを単一のテーブルProcessModに格納することを提案します。 ProcessMod抽象クラスを作成し、それにTable attributeと注釈を付けることによって。具体的なクラスは違いだけを定義します。

[Table("ProcessMod")] 
public abstract class ProcessMod 
{ 
    [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; } 
} 

public class EstimateProcessMod : ProcessMod 
{ 
    public int? SplitId { get; set; } 
    [ForeignKey("ProcessId")] 
    public virtual EstimateProcess EstimateProcess{ get; set; } 
} 

public class PriceListProcessMod : ProcessMod 
{ 
    [ForeignKey("ProcessId")] 
    public virtual PriceListProcess PriceListProcess { get; set; } 
} 

[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; } 

    [ForeignKey("ModId")] 
    public virtual ProcessMod ProcessMod { get; set; } 
} 

はおそらくProcessRelationクラスでPriceSourceTypeIdを取り除くとProcessModクラスに移動し、それ弁別を作るか、多分あなたはすべてでそれを使用する必要はありません得ることができます。それは実際にはアプリケーションの残りの部分に依存します。

Table per Hierarchyに興味があり、どのように動作するのか知ることができます。

関連する問題