Переместить дочерние объекты в новый родительский объект - PullRequest
2 голосов
/ 21 февраля 2012

Каков наилучший способ перемещения дочерних сущностей из одной родительской сущности в другую?Есть ли внутри ObjectContext или DbContext метод, который позволяет нам выполнить это?

public class Person
{
   public int PersonId
   public ICollection<Car> Cars
}

public class Car
{
   public int CarId
   public string Color
}

РЕДАКТИРОВАТЬ: в настоящее время я сначала использую модель EF 4.0 с шаблоном POCO.

1 Ответ

2 голосов
/ 22 февраля 2012

Я бы сказал, что вы хотите добиться смены владельца машины в этом примере. Если нет серьезных минусов против добавления обратной ссылки на Person в Car, я бы сказал что-то вроде:

public class Car
{
   ...
   public virtual Person Owner { get; protected set; }

   public void ChangeOwner(Person newOwner)
   {
          // perform validation and then 
          Owner = newOwner;
          // maybe perform some further domain-specific logic
   }
}

ПРИМЕЧАНИЕ: защищенный установщик должен принудительно вызывать метод ChangeOwner внешними потребителями. EF сможет установить его правильно благодаря автоматически сгенерированным прокси для классов POCO (предположим, вы используете их).

EDIT: Если нет возможности добавить обратную ссылку к Person, у вас все еще будет та же цель, если смотреть с точки зрения логики предметной области. Вы просто хотите сменить владельца автомобиля. Такая операция включает в себя две энтиты, поэтому я бы, вероятно, использовал метод, размещенный где-то вне сущности (независимо от того, где он должен быть размещен в хорошо спроектированной системе):

public void ChangeCarOwner(Person originalOwner, Person newOwner, int carId)
{
    Car car = originalOwner.RemoveCarOwnership(carId);
    newOwner.AddCarOwnership(car);
}

public class Person
{
    ...
    public Car RemoveCarOwnership(int carId)
    {
        Car car = this.Cars.Single(c => c.Id == carId);
        this.Cars.Remove(car);
        return car;
    }
}

Это просто концептуальный кусок кода, и его, безусловно, можно написать лучше (убедившись, что старый владелец действительно владеет автомобилем и т. Д.), Но я просто хотел представить идею, как бы я подошел к нему. Я также пропустил реализацию AddCarOwnership, потому что я полагаю, что это довольно прямолинейно. Я ввел эти методы, потому что добавление и удаление собственности может вызвать дальнейшую логику «внутри» конкретного человека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...