Как Вы обновляете таблицу внешним ключом к другой таблице в Модели Объекта ADO.NET?

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

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

            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.

Как я обрабатываю эту ситуацию? Я просто хочу добавить в коде в то же самое время, когда я добавляю в Настройке. Таблице 'Code' нужно установить Customizationid на PK/идентификационные данные, установленный Настройкой.

Какие-либо идеи?

7
задан esac 22 December 2009 в 05:42
поделиться

1 ответ

Для EF таблица без PK - это представление.

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

  1. Немного лжите белым цветом и убедите EF, что "представление" - это таблица
  2. Добавьте функции модификации (Insert/Update/Delete), чтобы вы могли их редактировать.

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

Т.е. что-то подобное в элементе 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).

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

Ура! Алекс

7
ответ дан 7 December 2019 в 07:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: