Я использую 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, который, с моей точки зрения, не является СУХИМЫМ и требует больших усилий.
Возможно, я мог бы вместо этого использовать внешние ключи, но тогда у меня не было бы ассоциаций, и это было бы не решение ORM, не зависящее от постоянства, а довольно тяжелый DAL, поддерживающий постоянство.