实体框架多对多插入

时间:2012-12-02 01:27:30

标签: c# entity-framework

我有三张桌子。命名: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。

有人帮忙解决这个问题吗?

1 个答案:

答案 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记录和新的关系记录。