Ошибка 3002: проблема в отображении фрагментов |c # linq для сущностей - PullRequest
57 голосов
/ 26 ноября 2010

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

Структура таблицы выглядит так:

FTPRuns

ID int

Last Run datetime

Достаточно просто.

Я обновил model.edmx в своем приложении, чтобы отразить это новое изменение, однако сейчас я получаю сообщение об ошибке ниже, и я не совсем уверен, что это значит.

Ошибка 3002: проблема в отображении фрагменты начинаются с строки 1330: Потенциальное нарушение времени выполнения Таблица ключей FTPRuns (FTPRuns.ID): Столбцы (FTPRuns.ID) отображаются на Свойства EntitySet FTPRuns (FTPRuns.ID) на концептуальной стороне но они не образуют EntitySet's ключевые свойства (FTPRuns.ID, FTPRuns.LastRun).

Вот фрагмент кода, который я также использую для обновления базы данных:

 using (ModelContainer ctn = new ModelContainer())
            {
                try
                {
                    FTPRun ftp = new FTPRun
                    {
                        LastRun = DateTime.Now
                    };

                    ctn.FTPRuns.AddObject(ftp);

                    int changes = ctn.SaveChanges();

                    Console.WriteLine(changes.ToString() + " Changes saved");
                    Console.WriteLine("The LastRun Date Has Been Updated");
                }
                catch (InvalidOperationException ex)
                {
                     Console.WriteLine(ex.ToString());
                }
            }

Если кто-нибудь может мне помочь, я был бы очень благодарен:)

спасибо.

Ответы [ 8 ]

93 голосов
/ 26 ноября 2010

Ваша модель сущности имеет комбинацию двух свойств FTPRuns.ID и FTPRuns.LastRun в качестве ключа сущности, в то время как ваша таблица имеет только столбец FTPRuns.ID в качестве первичного ключа. Таким образом, в вашей модели вы указываете, что комбинация FTPRuns.ID и FTPRuns.LastRun должна быть уникальной, в то время как в вашей базе данных существует более строгое требование, что один FTPRuns.ID должен быть уникальным.

Просто исключите свойство FTPRuns.LastRun из ключа объекта. Возможно, это произошло случайно, или Entity Framework не смог получить информацию о первичном ключе из базы данных, и ему пришлось вывести ключ сущности. Например, представления не имеют первичного ключа, и Entity Framework выведет ключ сущности как комбинацию всех необнуляемых столбцов.

41 голосов
/ 14 октября 2015

Даниэль Брюкнер решение отлично сработало для меня!Ниже по сути то, что он проинструктировал, но в графической форме - что может помочь ленивым читателям :).

То, на что вы хотите обратить внимание, это то, что ваш PK в модели, т. Е.

enter image description here

Мы видим, что у меня есть PKid.Теперь, если я посмотрю на мою модель EF:

enter image description here

Я вижу только 1 указанный ключ, что является правильным.Для меня это было не так, все 4 столбца были ключами.

Если вы щелкнете правой кнопкой мыши по столбцу (на диаграмме EF на VS), вы получите возможность поставить / снять галочку с Entity Key:

enter image description here

Убедитесь, что это соответствует вашей модели.В моем случае стоит отметить только id, сохранить и собрать проект.

19 голосов
/ 16 декабря 2010

это случилось со мной, когда я изменил ключевое поле в таблице (в базе данных) и обновил модель сущности.

Старый ключ все еще был в модели, поэтому я вошел в свойства объекта в файле .edmx и установил ключ в False.Это исправило это.

13 голосов
/ 06 февраля 2013

Я удалил таблицу из edmx (в edmx выберите таблицу, которая вызывает проблемы -> правый клик -> удалить) и затем выполнить «обновленную модель из базы данных»

это исправило для меня

4 голосов
/ 14 мая 2016

Я удалил сущность и класс из Обозревателя моделей и выполнил Обновление из базы данных, убедившись, что выбрана таблица. Это решило проблему для меня.

3 голосов
/ 09 апреля 2015

Я забыл установить первичный ключ при создании новой таблицы, поэтому я пошел в SQL Management Studio, чтобы сделать это. После этого я обновил файл model.edmx, чтобы отразить изменения, и получил ошибку 3002.

При обновлении модели было сделано, чтобы все столбцы таблицы были заданы как «ключи сущностей». Поэтому при просмотре файла model.edmx найдите соответствующую таблицу и щелкните правой кнопкой мыши различные свойства, чтобы убедиться, что только для первичного ключа выбран «Ключ объекта». Это решило мою проблему.

2 голосов
/ 03 мая 2013

Я удалил все таблицы из edmx и затем "Обновить модель из базы данных". Также убедитесь, что у вас есть владелец базы данных.

1 голос
/ 24 июля 2015

Проверьте первичный ключ для таблицы, если она существует, то 1) Откройте файл .edmx, выберите все таблицы и удалите из модели. 2) Обновить модель из БД и снова добавить все необходимые таблицы

...