«Добавление дочерней строки в дочернюю коллекцию родителя» v.s. «добавление дочернего элемента в дочернюю коллекцию datacontext» - PullRequest
1 голос
/ 19 декабря 2010

alt text

Я сравню 2 сценария, чтобы добавить строки Rsvp.Какой из них вы предпочитаете в производстве?


МЕТОД 1: Добавление нового объекта Rsvp в коллекцию Ratvatxtxt

Rsvp r = new Rsvp();
r.AttendeeName = "xport";

r.DinnerId = 1;//there will be an exception if it is set to a Dinnner object that does not exist.

entities.Rsvps.AddObject(r);

entities.SaveChanges();

Мы получимисключение, если мы пытаемся установить DinnerId для объекта Dinner, который не существует.Это поведение является последовательным и простым.


МЕТОД 2: Добавление нового объекта Rsvp в свойства Rsvps объекта Dinner

Rsvp r = new Rsvp();
r.AttendeeName = "xport";

r.DinnerId = 10000;//this Dinner does not exist!

Dinner d = entities.Dinners.First(x => x.DinnerId == 1);

d.Rsvps.Add(r);

entities.SaveChanges(); 

Свойству внешнего ключа DinnerId объекта Rsvp можно присвоить любое число.Когда этот объект Rsvp добавляется в коллекцию Rsvps объекта Dinner, DinnerId будет переопределен без уведомления.В приведенном выше примере показано, что DinnerId имеет значение 10000, которое является идентификатором объекта Dinner, который не существует.Это неизбежное поведение?

1 Ответ

2 голосов
/ 19 декабря 2010

Определенно метод 2 .

Почему?Потому что Rsvp не может существовать без Обед .В этих отношениях Dinner является родителем - и если бы мы создали репозиторий, мы бы создали DinnerRepository (поскольку Dinner - это «совокупный корень» в терминах DDD)

Что касается вашей заметки - да, это поведение, которого можно избежать, - вам не нужно выставлять внешние ключи модели.Этот параметр доступен при создании / обновлении модели.

Таким образом, отношения должны создаваться / изменяться с помощью сущности:

Rsvp r = new Rsvp();
r.AttendeeName = "xport";
r.DinnerId = 10000; // this throws a compiler error. good! we do not want people tinkering with FK's.
Dinner d = entities.Dinners.First(x => x.DinnerId == 1);
d.Rsvps.Add(r); // this is the correct way to add a RSVP
entities.SaveChanges(); 

Другими словами - единственный способсоздать / изменить Rsvp с помощью Dinner - и свойство FK не может быть изменено.

Что имеет смысл.

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