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)

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