LINQ2SQL: обновить поле объекта, которое имеет ссылку на другой объект - PullRequest
0 голосов
/ 14 ноября 2009

У меня есть следующая ситуация в LINQ: у меня есть объект (блог "Post"), у которого есть поле "Status", которое может принимать разные значения, и есть таблица, в которой перечислены все эти значения (в этой таблице только Id , Desc).
Теперь, поскольку отношения между обеими таблицами созданы, в модели Post.Status является не int, а экземпляром "PostStatus".

Таким образом, если я хочу установить статус сообщения, скажем, 20, я не могу просто установить поле в 20, мне нужно иметь экземпляр PostStatus для назначения. Эти значения состояния все жестко запрограммированы с помощью логики, поэтому хорошо, если в моем коде жестко задано "20".
Есть ли лучший способ сделать это, что это?

switch (Action) {
 case "Ignore":
  post.PostStatus = (from s in db.PostStatus where s.Id == 90 select s).First();
  break;
 case "Assign":
  post.PostStatus = (from s in db.PostStatus where s.Id == 20 select s).First();
  break;
 case "MarkDone":
  post.PostStatus = (from s in db.PostStatus where s.Id == 30 select s).First();
  break;
 case "MarkPublished":
  post.PostStatus = (from s in db.PostStatus where s.Id == 40 select s).First();
  post.Public = true;
  break;
}

Честно говоря, я ненавижу этот код, прежде всего потому, что он без необходимости запрашивает у БД экземпляр PostStatus, но в основном потому, что он настолько многословен.
Есть ли лучший способ сделать это?

Спасибо!
Daniel

1 Ответ

1 голос
/ 14 ноября 2009

Похоже, PostStatus более или менее перечислим. Мы делаем такие вещи постоянно, имея связанную таблицу в БД (как вы делаете), но затем удаляем связь в DBML и меняете тип CLR в дочернем столбце на тип enum. Тип enum объявляется с теми же значениями, что и строки в родительской таблице БД (в вашем случае Assign = 20, MarkDone = 30 и т. Д.). Я написал инструмент, который заполняет значения таблицы из кода для всех наших перечислений - таким образом, код является «основным» (он бомбит, если кто-то пытается изменить значение или имя существующего значения, но новые значения «просто работают» ). Теперь, когда вы хотите сделать что-то похожее на то, что вы делаете, необходимые данные уже есть в перечислении - просто установите Post.PostStatus = Action (при условии, что вы также измените Action со строки на тот же тип перечисления) - без БД удар необходим.

У нас также есть некоторые из них, которые немного более динамичны - те, которые мы кешируем один раз из БД при запуске приложения и помещаем в Словарь, чтобы мы могли просто установить идентификаторы без попадания в БД. Пока вы не говорите о миллионах ценностей, это очень эффективно.

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