Как я могу ссылаться на свойство, которое будет ForeignKey подключено к вычисленному поле DB (из представления)?Базовое вычисляемое свойство, являющееся внешним ключом в Entity Framework 6
У меня есть следующие:
public class PersonSite
{
public int Id {get;set;}
//...
public int PersonId {get;set;}
[ForeignKey("PersonId")]
public virtual Person Person {get;set;}
//...
}
public class Person
{
public Id {get;set;}
//...
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public int? MainPersonSiteId { get; protected internal set; }
[ForeignKey("MainPersonSiteId")]
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public PersonSite MainPersonSite { get; protected internal set; }
//...
}
Всякий раз, когда я пытаюсь обновить Person
, я получаю следующее excpetion:
Сообщение:
Зависимый свойство в ReferentialConstraint отображается до созданная магазином колонка. Столбец: «MainPersonSiteId». Стек трассировки:
на System.Data.Entity.Core.Mapping.Update.Internal.UpdateCompiler.BuildSetClauses (DbExpressionBinding мишени, PropagatorResult строк, PropagatorResult originalRow, процессор TableChangeProcessor, булева InsertMode, Dictionary`2 & outputIdentifiers , DbExpression & возвращения, булева & rowMustBeTouched) на System.Data.Entity.Core.Mapping.Update.Internal.UpdateCompiler.BuildUpdateCommand (PropagatorResult oldRow, PropagatorResult NewRow, процессор TableChangeProcessor) в System.Data.Entity.Core. Mapping.Update.Inter nal.TableChangeProcessor.CompileCommands (ChangeNode changeNode, UpdateCompiler компилятор)
В базе данных, которая Sql Server 12, Человек приходит из представления, где MainPersonSiteId проецируется из функции. Это вычисленное поле, которое не нужно обновлять ORM.
Как определить его с помощью EntityFramework?
EDIT:
Я только что удалось получить обновление работает, установив DatabaseGeneratedOption.Identity
вместо DatabaseGeneratedOption.Computed
, тем не менее, я только что нашел вставки все еще сломана. Таким образом, я проверил вставки с DatabaseGeneratedOption.Computed
назад и он ... работал:/
Ситуация:
- я могу вставить только с DatabaseGeneratedOption.Computed
- я могу обновить только с DatabaseGeneratedOption.Identity
Это странно, как MSDN says что DatabaseGeneratedOption.Computed
пусть DB генерировать значение как для вставки и обновления в то время как DatabaseGeneratedOption.Identity
делает только для вставок
Вы можете сделать это в базе данных? Можете ли вы создать ключ для запуска из вычисленного столбца? Если вы не можете сделать это в базе данных, я сомневаюсь, что вы можете сделать это с помощью EF. Если вы можете это сделать, пожалуйста, покажите, как это сделать. – JotaBe
@JotaBe, спасибо за комментирование. Я думаю, что DatabaseGeneratedOption только говорит, что свойство каким-то образом обрабатывается БД. Цитируется из MSDN, DatabaseGeneratedOption.Computed означает: «База данных генерирует значение, когда строка вставлена или обновлена». Больше ничего. EntityFramework не должен касаться этого поля. –
EF определенно коснется этого поля для обработки FK. И я думаю, вы не можете создать этот FK в базе данных. Ты можешь? Как вы ожидаете, что EF сделает что-то, что нельзя сделать? – JotaBe