Почему этот код Entity Framework не сохраняется в базе данных? - PullRequest
4 голосов
/ 23 сентября 2010

У нас есть простая таблица для каждого типа Модель Entity Framework 4.0: -

alt text

  • Все классы ALl являются POCO.
  • Класс сообщения abstract.
  • Discussion и List - это классы concretes, которые наследуют от сообщений (как показано на диаграмме).

Когда мы пытаемся сохранить Discussion, мы делаем следующий код: -

Posts.AddObject(discussion);

И синтаксис Sql Server состоит из двух частей.Вторая ошибка.Обратите внимание на пространство имен схемы sql?это почему?(Код взят из EFProf )

insert [dbo].[Posts]
      ([Subject],
       [UniqueSubject],
       [Content],
       [CreatedOn],
       [ModifiedOn],
       [IsVisible],
       [UserId])
values('Test Subject' /* @0 */,
       'sdfsdfsdfsdfsfdssd' /* @1 */,
       'this is a lot of content - pew pew pew' /* @2 */,
       '23/09/2010 12:22:08 PM +10:00' /* @3 */,
       '23/09/2010 12:22:08 PM +10:00' /* @4 */,
       1 /* @5 */,
       1 /* @6 */)
select [PostId]
from   [dbo].[Posts]
where  @@ROWCOUNT > 0
       and [PostId] = scope_identity()


insert [XWingModelStoreContainer].[Discussions]
      ([PostId])
values(20132 /* @0 */)

Обратите внимание, что имя таблицы [XWingModelStoreContainer]. [Обсуждения] ??Разве это не должно быть [dbo]. [Обсуждения] ??Как мы можем это исправить, пожалуйста?

.

.

ОБНОВЛЕНИЕ:

Кроме того, вот еще один снимок экрана свойств нашегодизайнер ... так что вы можете видеть, что мы думали , что он должен вызывать [dbo], так как это значение по умолчанию Database Scheme Name ..

alt text

ив файле Xml edmx .. есть две именованные строки ..

<edmx:StorageModels>
<Schema Namespace="XWingModel.Store" Alias="Self" 
     Provider="System.Data.SqlClient" ProviderManifestToken="2008"
      xmlns:store="http://schemas.microsoft.com.. snip ..."
      xmlns="http://schemas.microsoft.com/ ..snip ..">
    <EntityContainer Name="XWingModelStoreContainer">
.....

и ..

<!-- C-S mapping content -->
<edmx:Mappings>
  <Mapping xmlns="http://schemas.microsoft.c.. snip .." Space="C-S">
    <Alias Key="Model" Value="XWingModel" />
    <Alias Key="Target" Value="XWingModel.Store" />
    <EntityContainerMapping CdmEntityContainer="XWingEntities" 
        StorageEntityContainer="XWingModelStoreContainer">
.......

Это также помогает?Я понятия не имею, как эти имена попали туда (я полагаю, автоматически) и как мне нужно изменить их?Если это так, похоже, что это возможно только через XML-файл ... что хорошо ... но чувствует себя ... неправильно?

Приветствия:)

1 Ответ

1 голос
/ 27 сентября 2010

У меня была похожая проблема, и проблема была решена с помощью , убедившись, что у дочерних таблиц установлен первичный ключ .

Даже если дочерние таблицы имеют FK для родительскоготаблице, вам все равно нужно установить эти поля как PK, иначе EF не знает, как выполнить INSERT для дочерних таблиц.

Так что в вашем примере попробуйте установить PostId в качествепервичный ключ в таблице Discussion , затем обновите модель.

Дайте возможность.

...