2010-03-11 6 views
1

У меня есть база данных, где у меня есть две таблицы. Первая таблица имеет один столбец, который является идентификационным и первичным ключом. Вторая таблица содержит два столбца. Один из них - первичный ключ varchar, а другой - нулевой внешний ключ для первой таблицы.Entity Framework не любит отношения 0..1 к *

При добавлении таблицы в модели я получаю следующее сообщение об ошибке проверки:

Состояние не может быть указан для элемента столбца «DetailsControlSetId», потому что он помечен «Вычисленный» или StoreGeneratedPattern «идентичности».

где «DetailsControlSetId» - это вторая ссылка внешнего ключа во второй таблице.

Шаги для воспроизведения:

1) Создание нового .Net 3.5 Client Profile проект с Visual Studio 2010 RC.
2) Запустите скрипты ниже тестовой базы данных (пустая база данных будет делать).
3) Создайте модель EDMX, ориентируясь на созданную базу данных, но не хотите импортировать какие-либо таблицы.
4) Обновить модель из базы данных, выбрав две таблицы в базе данных (DetailsControlSet и приложение).
5) Подтвердите модель EDMX.

Сценарии для создания таблицы:

CREATE TABLE [dbo].[DetailsControlSet](
    [DetailsControlSetId] [int] IDENTITY(1,1) NOT NULL, 
    CONSTRAINT [PK_DetailsControlSet] PRIMARY KEY CLUSTERED 
    (
     [DetailsControlSetId] ASC 
    ) 
) 

GO 

CREATE TABLE [dbo].[Application](
    [ApplicationName] [varchar](50) NOT NULL, 
    [DetailsControlSetId] [int] NULL, 
    CONSTRAINT [PK_Application] PRIMARY KEY CLUSTERED 
    (
     [ApplicationName] ASC 
    ) 
) 

GO 

ALTER TABLE [dbo].[Application] WITH CHECK ADD CONSTRAINT [FK_Application_DetailsControlSet] FOREIGN KEY([DetailsControlSetId]) 
REFERENCES [dbo].[DetailsControlSet] ([DetailsControlSetId]) 
ON UPDATE CASCADE 
ON DELETE CASCADE 
GO 

ALTER TABLE [dbo].[Application] CHECK CONSTRAINT [FK_Application_DetailsControlSet] 
GO 
+0

Является ли столбец внешнего ключа фактическим сгенерированным магазином или является конструктором, импортирующим модель неправильно? Кроме того, какую версию Visual Studio вы используете? – Rory

+0

Дубликат: http: // stackoverflow.com/questions/2410590/what-is-the-proper-way-to-create-a-recursive-entity-in-entity-framework @Orion, пожалуйста, ответьте на вопрос, который я задал по вашему первоначальному вопросу, вместо того, чтобы перепрограммировать то же самое. –

+0

Хммм, дубликат этого тоже: http://stackoverflow.com/questions/2382135/recursive-entity-causing-all-sorts-of-problems –

ответ

2

Update Теперь, когда вы (наконец-то !) опубликовал шаги, чтобы воспроизвести это, я могу сделать ошибку на моем m achine. И чем отличается EDMX от «импорта всего поначалу» по сравнению с «импортными таблицами позже», то проблема делает проблему очевидной. Модель «работает» имеет следующую строку:

<Property Name="DetailsControlSetId" Type="int" /> 

модель «ошибка» имеет следующую строку:

<Property Name="DetailsControlSetId" Type="int" StoreGeneratedPattern="Identity" /> 

Это единственное существенное различие между этими двумя моделями.

Так, чтобы исправить это:

  1. правой кнопкой мыши EDMX в обозревателе решений.
  2. Открыть с помощью XML-редактора.
  3. Удалить StoreGeneratedPattern="Identity"
  4. Обратите внимание, что ошибка немедленно исчезает.

Имея этот тестовый пример, я смог провести некоторое исследование. Оказывается, this is a known bug in VS 2010 beta and was fixed a few days ago.

+0

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

0

Эта статья может помочь, была опубликована в ADO.NETofficial блоге команды

+0

К сожалению, это все основные сведения, которые я уже знаю. Я не ищу, как настроить базовый объект, а как настроить отношения 0..1 в *. –

+1

Ваш образец DB-скрипта уже работает правильно для меня. Я применил его к пустой БД и создал EF-модель. Нет ошибок. –

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