2016-03-16 52 views
0

我遇到了這種情況,我不確定究竟是什麼正確的解決方法。我有一個多對多的表。將多對多表與其他表關聯的最佳做法是什麼?

ProductsTable <--------> DrugsTable 

ProductsTable 
    |----- ProductID 
    |----- ProductName 

DrugsTable 
    |----- DrugID 
    |----- DrugStrength 
    |----- GCNSeqNumber 

的想法是,一個ProductName可以有很多DrugStrengthGCNSequNumber,和一個GCNSeqNumber可以有很多ProductName

所以,要創建這個,我創建的模型類,如下所示:

public class ProductsTable 
{ 
    public int ProductID { get;set; } 
    public string ProductName { get; set; } 
    public ICollection<DrugsTable> Drugs { get; set; } 

    public ProductsTable() 
    { 
     this.Drugs = new HashSet<DrugsTable>(); 
    } 
} 



public partial class DrugsTable 
{ 

    public int DrugID { get; set; }    
    public string Strength { get; set; }    
    public string GCNSeqNo { get; set; } 

    public virtual ICollection<ProductsTable> Products { get; set; } 

} 

然後我映射它:

modelBuilder.Entity<ProductsTable>() 
       .HasMany(c => c.Drugs).WithMany(i => i.Products) 
       .Map(t => t.MapLeftKey("ProductID") 
        .MapRightKey("DrugID") 
        .ToTable("RxTable")); 

到目前爲止好。 .NET創建另一個表,名爲RxTable,並存儲來自DrugsTableProductsTable的ID。現在的問題是,RxTable沒有id字段。我需要另一個表格,其中包含有關索賠的基本信息(日期,人員等)。將另一個表與這些多對多表關聯的最佳做法是什麼?如果我手動創建RxTable,.NET是否能夠自動填充表格?怎麼樣?

編輯響應於盧卡蓋爾西的反應制備:

RxTable的Rx =新RxTable();

 ProductsTable Product = db.Products.Where(x => x.ProductName == productName).FirstOrDefault(); 

     DrugsTable Drug = db.Drugs.Where(x => x.GCNSeqnumber == gcnSeqnumber).FirstOrDefault(); 

     if (Product == null) 
     { 
      Product = AddProduct(productName); 
     } 

     if(Drug == null) 
     { 
      Drug = AddDrug(strength, gcnSeqnumber); 
     } 

     Rx = (RxTable)db.RxTable.Where(x => x.ProductId == Product.ProductId && x.DrugId == Drug.DrugId).FirstOrDefault(); 

     if (Rx == null) 
     { 
      Rx.Drugs = Drug; 
      Rx.Products = Product; 

      db.RxTable.Add(Rx); 

     } 

     return Rx; 

回答

0

其實你可以簡單地添加一個自動生成的ID列到RxTable你(我的意思是,你可以自己與ID列數據庫創建表)的使用此列,請。英孚將能夠「忽略」該欄目。很明顯,如果你打算在其上放一個FK,那麼EF會忽略它,並且如果你打算從該表中刪除一條記錄而不先刪除鏈接的記錄,它將會簡單地崩潰。

如何創建一個三鍵映射表?

像:

public class ProductsTable 
{ 
    public int ProductID { get; set; } 
    public string ProductName { get; set; } 
    public ICollection<RxTable> RxTable { get; set; } 
} 

public partial class DrugsTable 
{ 

    public int DrugID { get; set; } 
    public string Strength { get; set; } 
    public string GCNSeqNo { get; set; } 

    public virtual ICollection<RxTable> RxTable { get; set; } 

} 

public class Person 
{ 
    public int PersonID { get; set; } 

    public virtual ICollection<RxTable> RxTable { get; set; } 
} 

public class RxTable 
{ 
    [Key, Column(Order = 0)] 
    public int ProductID { get; set; } 
    [Key, Column(Order = 1)] 
    public int DrugID { get; set; } 
    [Key, Column(Order = 2)] 
    public int PersonID { get; set; } 

    public virtual ProductsTable ProductsTable { get; set; } 
    public virtual DrugsTable DrugsTable { get; set; } 
    public virtual Person Person { get; set; } 
} 

這是明確更難管理,但它是有根據的代碼控制一切的最好辦法,對不是依靠外的EF-控制技巧SQL Server上。

希望它有幫助!

+0

有趣。我會試一試並報告。謝謝。 – user1828605

+0

我正在實施這一點,我認爲這是相當可以理解的。但是,我有一個問題,如果產品和藥品已經存在或不存在,在插入RxTable之前如何檢查?如果我可以做到這一點,請參閱我的編輯? – user1828605

+0

是的,看起來不錯!還有一個建議:在RxTable上添加一個UNIQUE KEY約束(ProductID,DrugID,PersonID);這樣你就可以肯定,絕不會有重複的記錄:) –

相關問題