Я бы сказал, что вы хотите добиться смены владельца машины в этом примере. Если нет серьезных минусов против добавления обратной ссылки на 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
, потому что я полагаю, что это довольно прямолинейно. Я ввел эти методы, потому что добавление и удаление собственности может вызвать дальнейшую логику «внутри» конкретного человека.