我遇到这种情况,我不确定解决问题的正确方法是什么。我有一个多对多的表。
ProductsTable <--------> DrugsTable
ProductsTable
|----- ProductID
|----- ProductName
DrugsTable
|----- DrugID
|----- DrugStrength
|----- GCNSeqNumber
我们的想法是,ProductName
可以有多个DrugStrength
或GCNSequNumber
,而一个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
的表,并存储来自DrugsTable
和ProductsTable
的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;
答案 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上的外部控制技巧。
希望它有所帮助!