将多对多表与另一个表相关联的最佳做法是什么?

时间:2016-03-16 13:53:10

标签: c# .net entity-framework many-to-many

我遇到这种情况,我不确定解决问题的正确方法是什么。我有一个多对多的表。

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

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

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

我们的想法是,ProductName可以有多个DrugStrengthGCNSequNumber,而一个GCNSeqNumber可以有多个ProductName

因此,为了创建它,我创建了Model类,如下所示:

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是否能够自动填充表格?怎么样?

根据Luca Ghersi的回应编辑:

RxTable Rx = new 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;

1 个答案:

答案 0 :(得分:0)

实际上,您只需将自动生成的ID列添加到RxTable(我的意思是,您可以在ID上使用ID列自行创建表),并根据需要使用此列。 EF将能够忽略&#34;那一栏。显然,如果要在其上放置FK,EF将忽略它,如果要从该表中删除记录而不首先删除链接记录,EF将会崩溃。

如何创建三键映射表?

像:

    ON_MESSAGE(WM_DEVICECHANGE, OnMyDeviceChange)//in BEGIN_MESSAGE_MAP(CMainFrame, CBCGPMDIFrameWnd)

    LRESULT CMainFrame::OnMyDeviceChange(WPARAM wParam, LPARAM lParam)
{
    //return 0;//essentially comment out everything else
    PDEV_BROADCAST_HDR pHdr = (PDEV_BROADCAST_HDR)lParam;
    AddLogLine("1");
//  AfxMessageBox(pHdr->dbch_devicetype);
    PDEV_BROADCAST_DEVICEINTERFACE pDevInf = (PDEV_BROADCAST_DEVICEINTERFACE)pHdr;
    AddLogLine("2");
    CString type;
    type.Format("%d",pHdr->dbch_devicetype);
    AddLogLine("type = " + type);
    if(pHdr->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE)
    {
        UpdateDevice(pDevInf, wParam);
    }
    return 0;
}






//More relevant code:
struct _DEV_BROADCAST_HDR {     /* */
    DWORD       dbch_size;
    DWORD       dbch_devicetype;
    DWORD       dbch_reserved;
};

typedef struct  _DEV_BROADCAST_HDR      DEV_BROADCAST_HDR;
typedef         DEV_BROADCAST_HDR       DBTFAR* PDEV_BROADCAST_HDR;

它最终难以管理,但它是在代码中控制所有内容的最佳方式,而不是依赖于SQL Server上的外部控制技巧。

希望它有所帮助!