0

我有三张桌子。命名为:Merchants、MerchantNumberX、Numbers(许多其他实体都使用数字——这只是一个示例)。

Merchants 表如下所示:

MerchantGuid, MerchantName

数字表如下所示:

NumberGuid, PhoneNumber

外部参照表如下所示:

MerchantGuid, NumberGuid

我知道在实体框架中我可以这样做:

var newNumber = new Number { NumberGuid = Guid.NewGuid(), PhoneNumber = "55555555555" };
Merchants.Numbers.Add(newNumber);

这会将关系插入到两个表实体之间的外部参照表中。但是,有没有其他方法可以在没有 Merchant 对象的情况下将这些表“关联”在一起?

例如:

 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。

有人帮这个吗?

4

1 回答 1

2

但是,有没有其他方法可以在没有 Merchant 对象的情况下将这些表“关联”在一起?

不。与 EF 的多对多关系是独立关联,这意味着您的模型中没有可用的外键属性。您需要使用这两个集合来操作关系。这是唯一的方法。

但是,看下一点...

...如果有一种快速的方法可以建立这种关系,而无需调用数据库来获取 Merchant 对象,因为我们已经有了有效的 MerchantGuid。

要创建关系,您不需要Merchant从数据库加载现有实体。您可以创建一个“存根”实体,并将键属性设置为有效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记录和一条新关系记录。

于 2012-12-02T13:42:22.577 回答