【发布时间】:2011-05-17 11:16:04
【问题描述】:
我正在使用 EF4 并尝试使用 POCO,并且一直保持无知。这工作正常,除了关联。
举个简单的例子,我有国家和国家有关联的货币。每个国家/地区都有一个关联 (FK),它是将货币对象设置为属性,即:
public class Currency
{
//three-character currency-code
public virtual string Id { get; set; }
public virtual string Name { get; set; }
//There are other primitive properties, but they're not important
}
public class Country
{
//two-character country-code
public virtual string Id { get; set; }
public virtual string Name { get; set; }
//There are other primitive properties, but they're not important
//Fixup not shown
public virtual Currency Currency { get; set;}
}
我通过 POCO(从 MS POCO tt 自动生成)创建了一个新国家/地区:
var currency = currencyRepository.Find("AAA"); //returns POCO for the 'AAA' currency
var country = new Country { Id = "AA", Name = "AA Test", Currency = currency};
我使用UnitOfWork 模式来实现数据库更改,大致如下:
public void RegisterNew(country)
{
MyDbContext.Countries.AddObject(country);
}
但是,当我调用SaveChanges 时,EF 返回我无法创建Country,因为关联的Currency 已经存在(插入Currency 失败,PK 违规)。
嗯,好的,但我想将 Country 与现有的 Currency 关联起来……这就是我给它货币的原因。
我可以将RegisterNew 中的代码添加到Attach 现有的Currency 对象,但是,我想要一个通用的解决方案。我不想为每个我想要保留的附加现有关联的 POCO 对象编写特定的代码。
有没有办法告诉 EF 如果关联实体已经存在,则使用它(如果 POCO 实体与持久实体不匹配,则可能会抛出错误)?
我假设不是。如果无法做到这一点,我将不得不编写很多(对我而言)毫无意义的额外代码来说‘是的,这是一个现有的关联,显然,使用现有的持久实体),更烦人的是,我从我的角度来看,将无法编写通用代码来添加任何类型的 POCO 对象,这不是 DRY 和大量无意义的工作。
也许我可以改用外键,但那样我就没有关联了,它也不是一个与持久性无关的 ORM 解决方案,而是一个相当重的持久性感知 DAL。
【问题讨论】:
-
您是否从用于保存国家/地区的同一上下文中加载货币?
-
嗨@Ladislav,谢谢,我一直在阅读您的一些帖子和ladislavmrnka.com。也许我采取了错误的方法,但就个人而言,我只想对持久性级别的持久性感兴趣。我的观点是我不想手动从上下文中加载我的国家,因为我必须为任何具有关联的类编写大量样板代码......
-
您不需要“手动”加载它。我只是问你的
currencyRepository.Find是否使用与RegisterNew相同的上下文实例? -
好的,那么不,它们是不同的上下文。我将存储库(访问)和 uow(更新)分开。我想将 POCO 发送到我的 UoW,而不必关心它们的相关关联。
-
在这种情况下,你注定要失败。除非您从第一个上下文中分离实体并将其附加到远离持久性无知的新上下文,否则无法做到这一点。如果您的存储库和 UoW 共享上下文,它应该可以工作。
标签: entity-framework associations poco