매핑 된 테이블을 사용하여 MenuItem을 IdentityRole에 매핑하여 로그인 된 사용자 역할을 기반으로 메뉴를 만들 수있는 코드가있는 첫 번째 모델이 있습니다. 할당.Entity Framework 6 - 외부 키 IdentityRole을 가진 엔티티를 추가하는 방법
public class MenuItem
{
public int Id { get; set; }
public string Text { get; set; }
}
public class MenuRoleMap
{
[Key]
public int Id { get; set; }
public virtual MenuItem MenuItem { get; set; }
public virtual IdentityRole Role { get; set; }
}
IdentityRole과 정체성의 나머지는이 같은 내 ApplicationDbContext을 통해 상속 한 IdentityDbContext를 통해 자동으로 연결되어, 다음 컨텍스트가 일치해야합니다.
public class ApplicationDbContext : IdentityDbContext<User>
테이블의 모든
들이 예상 열과 외래 키를 바로보고, 여기에 MenuRoleMap 테이블이다 나는 내가 사용하는 MenuItem을하고 IdentityRole의 유효한 기존 인스턴스가 시도하고이 오류가 발생합니다이 테이블
foreach (IdentityRole role in selectedRoles)
{
MenuRoleMap mrm = new MenuRoleMap();
mrm.MenuItem = menuItem;
mrm.Role = role;
db.MenuRoleMaps.Add(mrm);
}
db.SaveChanges(); /// <<<=== HERE ERROR BECAUSE THE role IS ALREADY IN DB
에 새 개체 항목을 추가하는
A first chance exception of type 'System.Data.Entity.Validation.DbEntityValidationException' occurred in EntityFramework.dll
Role: Role SystemsAdministrator already exists.
당연히 그것이 존재한다는 것은 알고 있습니다. 이미 데이터베이스에 있습니다. EF는 이미 존재하는 경우 외래 키 엔티티에 대한 새로운 엔티티 항목을 추가하려고해서는 안됩니다.
MenuItem의 경우 IdentityRole에만 적용됩니다.
은 내가 IdentityRole 프록시 객체가 된 이후 문제가 프록시 생성 알았는데, 그래서 나는this.Configuration.ProxyCreationEnabled = false;
을이 꺼져하지만 난 여전히 같은 오류가 발생합니다.
제 질문은 외래 키가 IdentityRole 인 엔터티를 어떻게 추가합니까?
스태커에게 감사드립니다. 문제는 상황 자체가 하나를 제외한 객체의 유효성이 아니었다 다양한 솔루션을 조사하는 동안 아래 사람들의 도움 후 내 자신의 질문
TO
답을 발견했다. 그 대상은 옳았다. 내가 깨닫지 못했던 것은 그것이 맥락에서 나온 대상이 아니라는 것이다. 그것은 팩시밀리였다. 이 팩시밀리를 모델에 추가하려고하면 컨텍스트에서 이미 존재한다고 말하고 다시 추가 할 수는 없습니다. 아이템의 상태를 오버라이드 (override)하려고하면 (자), 다른 종류의 에러가 발생했습니다.
해상도
는 헤이 프레스토 모든 일을 컨텍스트에서 개체를 다시로드하고 그래서foreach (IdentityRole role in selectedRoles)
{
// Here I'm getting the role from the context using the ID I have from the facsimile
IdentityRole roleToUse = db.Roles.Where(x => x.Id == role.Id).FirstOrDefault();
// carry on as normal
MenuRoleMap mrm = new MenuRoleMap();
mrm.MenuItem = menuItem;
mrm.Role = roleToUse; // note I'm using the retrieved 'roleToUse'
db.MenuRoleMaps.Add(mrm);
}
db.SaveChanges();
처럼 부모 항목이 추가 단순히이었다.
선택한 역할은 다음과 같은 컨텍스트에서 제공됩니다. ApplicationDbContext db = ApplicationDbContext.Create(); List selectedRoles = db.Roles.ToList(); –
AndyM
'role'은 db.Entry (role) .State = Detached를 말합니다. 동일한 컨텍스트 내의 'menuItem'이 State = Unchanged (사실임)라는 것을 알 수 있듯이 두 항목 모두 변경되지 않을 것으로 기대합니다. – AndyM
죄송합니다. 다른 컨텍스트에 대한 참조를 만들었지 만 실제로는 ApplicationDbContext : IdentityDbContext과 동일합니다. 이것은 MVC 프로젝트입니다.이 인스턴스에서 컨트롤러는 역할을 검색하는 메소드에 컨텍스트를 전달합니다.이 경우 컨텍스트가 동일하다고 생각합니다. –
AndyM