Странное исключение с ограничением сущности - PullRequest
0 голосов
/ 26 декабря 2009

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

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

Вот ошибка, которую я получаю:

Entities in 'Entities.WSUser_Detail' participate in 
the 'FK_WSUser_Detail_WSCountry' relationship. 
0 related 'WSCountry' were found. 1 'WSCountry' is expected.

Что странного в этой ошибке, так это то, что в моем коде я никогда не ссылаюсь ни на один объект WSUser_Detail. Кто-нибудь придумал такую ​​ошибку? Мой код действительно прост:

newUser = (from user in GB.Context.WSUsers
                where user.IDUser == nFound
                select user).FirstOrDefault();

newUser.DoNotSend = false;
newUser.IP = Request.UserHostAddress;
newUser.LastDtActivity = DateTime.Now;
newUser.Language1 = GB.User.Language;
newUser.LastVersion = sVersion;
newUser.FlushNextTime = false;

GB.Context.SaveChanges();

Ошибка возникает в SaveChanges ()

Абсолютно никакой WSUser_Detail не вызывается в моем коде ... поэтому мне интересно, почему он должен запрашивать ссылку на объект, который никогда не вызывается (но существует в контексте сущностей).

Есть идеи?

Странно то, что у меня не было этой проблемы раньше, даже если код, похоже, не изменился.

Я обновил Model.edmx, чтобы убедиться, что это не причина, но все равно не работает, я проверял много раз, и ошибка не должна появляться ВСЕ, поскольку у меня нет объекта WSUser_Detail.

Ответы [ 4 ]

1 голос
/ 26 декабря 2009

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

SELECT
    fk.name ,
    t1.Name 'Parent table',
    c1.Name 'Parent column',
CASE WHEN c1.is_nullable = 0 THEN 'No' ELSE 'Yes'
END AS 'Parent column nullable',
    t2.Name 'Referenced table',
    c2.Name 'Referenced column'
FROM 
    sys.foreign_keys fk
INNER JOIN 
    sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id
INNER JOIN 
    sys.tables t1 ON fkc.parent_object_id = t1.object_id    
INNER JOIN 
    sys.tables t2 ON fkc.referenced_object_id = t2.object_id
INNER JOIN 
    sys.columns c1 ON t1.object_id = c1.object_id AND fkc.parent_column_id = c1.column_id
INNER JOIN 
    sys.columns c2 ON t2.object_id = c2.object_id AND fkc.referenced_column_id = c2.column_id
WHERE 
    fk.name = 'FK_WSUser_Detail_WSCountry'

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

Надеюсь, это должно прояснить, какой кусок головоломки вам не хватает.

1 голос
/ 26 декабря 2009

На уровне базы данных я бы предположил, что у вас есть ограничение внешнего ключа для поля, которое не может иметь значение NULL .. и у вас полученная модель имеет связь между таблицами WSCountry и WSUser.

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

Полагаю, ваш WSUser должен иметь установленную сущность WSCountry. Есть ли свойство WSUser.WSCountry для установки?

Если моя догадка верна - убедитесь, что это установлено перед сохранением.

Между прочим, 'FK_WSUser_Detail_WSCountry' не предлагает объект - он ссылается на ограничение отношения / FK, установленное в вашей базе данных. Entity Framework использует эти ограничения, чтобы угадать, как ваши сущности должны быть связаны ..

0 голосов
/ 29 декабря 2009

Я наконец нашел, в чем проблема!

Я использовал глобальный контекст, как показано здесь. Но в некоторых предыдущих тестах я добавил детали пользователя, которые не содержали никакой ссылки на wscountry, которая требуется. Так что сначала я столкнулся с исключением, чего я и ожидал.

Реальная проблема заключается в том, что всякий раз, когда недопустимый объект объекта добавляется с помощью метода AddTo (entityObj), любой дальнейший вызов SaveChanges () будет пытаться добавить этот объект в контекст, даже если страница, вызвавшая проблему, существует больше, так как объект Context был "поврежден".

Таким образом, каждый вызов SaveChanges () будет отклоняться Исключением после любого AddTo с недопустимым объектом сущности ...

Мой вопрос будет таким: возможно ли иметь информацию, подобную действительности сущности, ДО того, как пытаться добавить ее в используемом контексте? Поскольку фатальная ошибка, подобная этой, логична, но ее трудно понять, поскольку она показывает ошибку, которая была сделана несколько часов назад (при работе над проектом ASP.Net с использованием глобального контекста).

0 голосов
/ 28 декабря 2009

Ваша модель (EDMX) говорит, что между WSUser и WSUser_Detail существует отношение 1: 1, но ваш вопрос подразумевает, что вы ожидаете, что отношение будет 1: 0..1, поэтому либо ваше собственное понимание, либо ваша модель неверна , Если модель имеет отношение отношений 1: 1, то Entity Framework будет проверять это всякий раз, когда вы создаете или сохраняете объект WSUser. Это источник ошибки, которую вы видите.

Поскольку ваш вопрос подразумевает, что это неправильная кардинальность для этих отношений, вы, вероятно, хотите пойти и исправить EDMX. Для этого найдите ассоциацию FK_WSUser_Detail_WSCountry в Обозревателе моделей. Щелкните по нему и разверните два свойства End в окне свойств. Измените кратность соответствующего конца.

...