1

Как я могу ссылаться на свойство, которое будет 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 делает только для вставок

+0

Вы можете сделать это в базе данных? Можете ли вы создать ключ для запуска из вычисленного столбца? Если вы не можете сделать это в базе данных, я сомневаюсь, что вы можете сделать это с помощью EF. Если вы можете это сделать, пожалуйста, покажите, как это сделать. – JotaBe

+0

@JotaBe, спасибо за комментирование. Я думаю, что DatabaseGeneratedOption только говорит, что свойство каким-то образом обрабатывается БД. Цитируется из MSDN, DatabaseGeneratedOption.Computed означает: «База данных генерирует значение, когда строка вставлена ​​или обновлена». Больше ничего. EntityFramework не должен касаться этого поля. –

+0

EF определенно коснется этого поля для обработки FK. И я думаю, вы не можете создать этот FK в базе данных. Ты можешь? Как вы ожидаете, что EF сделает что-то, что нельзя сделать? – JotaBe

ответ

1

столбцов в базе данных определяются как IDENTITY отличаются от тех, рассчитанных.

Когда вы вставляете новую строку, механизм базы данных создает новое значение (число) для столбца IDENTITY-Column. Например, вы можете использовать это как основной/уникальный столбец ключей. Вы не можете обновить столбец IDENTITY. Вы не можете определить формулу для выполнения вычислений.

Когда вы хотите вычислить somethin 'на уровне таблицы, вы можете использовать вычисленные столбцы. Здесь вы должны определить формулу.Когда вы создаете вычисленный столбец с опцией PERSISTED, SQL-Server хранит вычисленные значения в таблице. Когда вы обновляете столбцы, которые являются частью вычисленного столбца, только тогда обновляется вычисляемый столбец. PERSISTED вычисляемые столбцы могут быть частью столбцов index-key и внешних ключей. Если вы не используете опцию PERSISTED, база данных не хранит вычисленные значения. Поэтому он должен выполнять вычисления каждый раз, когда запрос нужен для вычисленного столбца.

При обновлении строки убедитесь, что вычисленный столбец не является частью списка столбцов, подлежащих обновлению (в предложении SET-инструкции оператора UPDATE).

Вы можете определить FOREIGN KEYs только между таблицами, а не представлениями.

Смежные вопросы