我有三张桌子。命名:Merchants,MerchantNumberX,Numbers(数字由许多其他实体使用 - 这只是一个例子)。
Merchants表格如下:
MerchantGuid, MerchantName
Numbers表格如下:
NumberGuid, PhoneNumber
外部参照表如下所示:
MerchantGuid, NumberGuid
我知道在实体框架中我可以这样做:
var newNumber = new Number { NumberGuid = Guid.NewGuid(), PhoneNumber = "55555555555" };
Merchants.Numbers.Add(newNumber);
这会将关系插入到两个表实体之间的Xref表中。 但是,有没有其他方法可以将这些表“关联”在一起而没有商家对象?
例如:
var newNumber = new Number { NumberGuid = Guid.NewGuid(), PhoneNumber = "4444444444" };
newNumber.MerchantGuid = alreadyKnownMerchantGuid; // This is not available, by the way, just an example of something we are looking for in a many-to-many relationship.
然而,newNumber给了我一个“商家”属性,它只是递归重复。
我们正在重写大量代码并想知道是否有快速建立此关系的方法,而无需调用数据库来获取Merchant对象,因为我们已经拥有有效的MerchantGuid。
有人帮忙解决这个问题吗?
答案 0 :(得分:2)
但是,有没有其他方法将这些表“关联”在一起 没有商家对象?
没有。与EF的多对多关系是独立关联,这意味着您的模型中没有可用的外键属性。您需要使用两个集合来操纵关系。这是唯一的方法。
但是,请参阅下一点......
...如果有一种快速的方式来建立这种关系而不必 我们已经调用数据库来获取Merchant对象 拥有有效的MerchantGuid。
要创建关系,您不需要从数据库加载现有的Merchant
实体。您可以创建一个“stub”实体,并将key属性设置为有效的MerchantGuid
,然后将其附加到上下文中。对于EF,这是状态Unchanged
中的实体,其行为就像从数据库加载一样:
var newNumber = new Number {
NumberGuid = Guid.NewGuid(), PhoneNumber = "55555555555" };
var merchant = new Merchant {
MerchantGuid = alreadyKnownMerchantGuid, Numbers = new HashSet<Number>() };
context.Merchants.Attach(merchant);
merchant.Numbers.Add(newNumber);
context.SaveChanges();
这里没有涉及数据库查询。 SaveChanges
将在联接表中创建新的Number
记录和新的关系记录。