Как автоматически прикрепить ассоциации при сохранении poco? - PullRequest
0 голосов
/ 17 мая 2011

Я использую 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, поддерживающий постоянство.

1 Ответ

1 голос
/ 05 июля 2011

Попробуйте установить примитивное значение для идентификатора валюты в Стране, а не в объекте Валюта.Я столкнулся с подобной проблемой, и это решение работает для меня!

...