Как обновить таблицу с внешним ключом для другой таблицы в ADO.Net Entity Model? - PullRequest
7 голосов
/ 22 декабря 2009

У меня есть 2 таблицы, у Table1 есть первичный ключ 'CustomizationId', а у Table2 есть FK Customizationid, который соответствует этому. Таблица 2 не имеет первичного ключа.

Я пытаюсь добавить новую запись из веб-формы. Я пытаюсь сохранить это в базе данных и получаю сообщение об ошибке:

            Customization customization = new Customization();
            Code code = new Code();
            customization.Name = CustomizationName.Text;               
            customization.LastUpdated = DateTime.Now;

            code.Top = top_js.InnerText;
            code.Bottom = bottom_js.InnerText;

            //code.CustomizationId = customization.CustomizationId;

            customization.Code = code;              
            entities.AddToCustomizations(customization);
            entities.SaveChanges();

Когда я вызываю SaveChanges, я получаю сообщение об ошибке, независимо от того, добавляю ли я в закомментированную строку.

Unable to update the EntitySet 'Code' because it has a DefiningQuery and no <InsertFunction> element exists in the <ModificationFunctionMapping> element to support the current operation.

Как мне справиться с этой ситуацией? Я просто хочу добавить код в то же время, что и в настройку. Таблица «Код» должна иметь значение Customizationid, равное PK / Identity, установленному настройкой.

Есть идеи?

1 Ответ

7 голосов
/ 22 декабря 2009

Что касается EF, то таблица без ПК является представлением.

Это означает, что у вас есть два варианта:

  1. Скажите немного белой лжи и убедите EF, что 'view' - это таблица
  2. Добавить функции модификации (Вставить / Обновить / Удалить), чтобы вы могли редактировать их.

Обычно функции модификации являются хранимыми процедурами, но вы можете добавить T-SQL непосредственно в SSDL, если у вас нет доступа к базе данных ...

т.е. что-то вроде этого в <StorageModel> элементе EDMX для каждого действия (вставка, обновление и удаление):

<Function Name="InsertCode" BuiltIn="false" IsComposable="false" >
       <CommandText>
                INSERT dbo.TCode(ID, Name) VALUES (@ID, @Name)
       </CommandText>
       <Parameter Name="ID" Type="int" Mode="In" />
       <Parameter Name="ID" Type="nvarchar(max)" Mode="In" />
</Function>

Когда у вас есть функции модификации в вашем SSDL, вам нужно отобразить их , чтобы EF использовал их по мере необходимости.

В вашей ситуации я рекомендую (1).

Надеюсь, это поможет.

Приветствие Alex

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