EF 5, объект обновления дает " произошло нарушение ограничения ссылочной целостности"
в моей модели у меня есть куча объектов домена. Теперь у меня проблема при попытке обновить пользовательский объект. Пользователь имеет отношение foreignkey к объекту роли. Когда я обновляю User-object без изменения значения foreignkey (FkRoleId), все работает нормально. Но когда я меняю роль для текущего пользователя, которого я хочу обновить, я получаю ошибку:
произошло нарушение ограничения ссылочной целостности: свойство значения, определяющие референтные ограничения не согласуются между основными и зависимыми объектами в отношениях.
вот как я обновляю свой пользовательский объект:
public void Update(User user)
{
using (var context = new DBEntities())
{
context.Entry(user).State = System.Data.EntityState.Modified;
context.SaveChanges();
}
}
Как я могу обновить свой пользовательский объект без получения этого исключения? Должен быть способ проверки значения foreignkey для mappen пользователя на другую роль.
вот мои классы домена в этом случае:
public partial class User
{
public User()
{
this.Advertisers = new HashSet<Advertiser>();
this.Cases = new HashSet<Case>();
this.Materials = new HashSet<Material>();
}
public int PkId { get; set; }
public int FkRoleId { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public System.DateTime Created { get; set; }
public bool Active { get; set; }
public virtual ICollection<Advertiser> Advertisers { get; set; }
public virtual ICollection<Case> Cases { get; set; }
public virtual ICollection<Material> Materials { get; set; }
public virtual Role Role { get; set; }
}
public partial class Role
{
public Role()
{
this.Users = new HashSet<User>();
}
public int PkId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual ICollection<User> Users { get; set; }
}
2 ответов
цитирую ваш комментарий:
однако; если я установил пользователя свойства навигации.Роль для null работает только штраф. Но разве это рекомендуемый способ работы?
да, в этом случае.
вы должны иметь в виду, что вы вводите новый контекст с отдельным объектом user
(включая ссылку на user.Role
). Установив состояние Modified
присоединения объекта user
вместе с user.Role
к этому новому контекст.
потому что вы используете ассоциацию внешнего ключа-это означает, что внешний ключ представлен свойством FkRoleId
в классе модели - связь описывается двумя способами: свойством навигации user.Role
и скалярным свойством user.FkRoleId
. Если они не последовательны-то есть user.Role.PkId != user.FkRoleId
- EF не знает, какой из них описывает правильные отношения и выдает исключение, которое у вас есть.
если вы устанавливаете user.Role
to null
EF рассмотрит the user.FkRoleId
только как свойство, описывающее связь между Пользователем и ролью и двусмысленность, которая вызывала исключение, удаляется.
в интересах поисковиков, я получаю ту же ошибку, но нашел быстрое решение.
я загружал класс с отношением FK в представление для редактирования. Даже без изменений FK был удален, и эта ошибка произошла. Исправление состояло в том, чтобы включить скрытое поле в представление Razor, содержащее FK. например,
@Html.HiddenFor(model => model.ReleaseInfo.BookId)
код скопирован ниже, чтобы вы могли проверить, похожа ли ваша ситуация.