Исключение Entity Framework во время выполнения: объекты участвуют в отношениях?

#c# #asp.net #entity-framework #entity-framework-5 #asp.net-identity

#c# #asp.net #entity-framework #entity-framework-5 #asp.net-identity

Вопрос:

При использовании подхода code first при запуске моего проекта. Во время регистрации нового пользователя entity framework выдает это исключение:

Additional information: Entities in 'ApplicationDbContext.IdentityUsers' participate in the 'ApplicationUser_UserDetails' relationship. 0 related 'ApplicationUser_UserDetails_Target' were found. 1 'ApplicationUser_UserDetails_Target' is expected.

Было выдано исключение:

 var manager = new UserManager();
var user = new ApplicationUser() { UserName = UserName.Text };
//This line At the time of creating user
IdentityResult result = manager.Create(user, Password.Text);
 

Я создал код схемы:

 public class ApplicationUser : IdentityUser
    {
        public Nullable<DateTime> DateOfCreation { get; set; }
        public Nullable<bool> IsActive { get; set; }
        public Nullable<DateTime> LastLogin { get; set; }
        public UserDetails UserDetails { get; set; }
        public virtual ICollection<TaskSheetManagement> TaskSheet { get; set; }
        public virtual ICollection<Projects> Projects { get; set; }
    }

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("DefaultConnection")
        {
        }

        protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<IdentityUser>().HasKey(pk => pk.Id).ToTable("Users");
            modelBuilder.Entity<ApplicationUser>().HasKey(pk=>pk.Id).ToTable("Users");
            modelBuilder.Entity<UserDetails>().HasKey(pk => pk.UserDetailId).ToTable("UserDetails");
            modelBuilder.Entity<ApplicationUser>().HasRequired(p => p.UserDetails).WithRequiredPrincipal(c => c.ApplicationUser);
            modelBuilder.Entity<ApplicationUser>()
                .Property(t => t.UserName).IsRequired()
                .HasMaxLength(14)
                .HasColumnAnnotation("Index",
                new IndexAnnotation(new IndexAttribute("U_Username", 1) { IsUnique = true }));
            modelBuilder.Entity<UserDetails>()
                .Property(t => t.Email).IsRequired()
                .HasMaxLength(25)
                .HasColumnAnnotation("Index",
                new IndexAnnotation(new IndexAttribute("U_Email", 2) { IsUnique = true }));
            base.OnModelCreating(modelBuilder);
        }
    }
 

А UserDetails — это:

 public class UserDetails
{
    public int UserDetailId { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public string CountryName { get; set; }
    public string Gender { get; set; }
    public string Nic { get; set; }
    public string ResidentAddress { get; set; }
    public string CellNO { get; set; }
    public string PhoneNo { get; set; }
    public string Religion { get; set; }
    public ApplicationUser ApplicationUser { get; set; }
}
 

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

Ответ №1:

Вы создали ассоциацию 1: 1, но ассоциации 1: 1 не работают таким образом в Entity Framework.

Ассоциации 1: 1 должны использовать один и тот же первичный ключ. То, как вы определили это, — это две ассоциации 1: M, и они конфликтуют друг с другом.

Если вы хотите 1: 1, то вам нужно изменить свой первичный ключ, чтобы UserDetails был Id, а затем вы должны сопоставить их вместе с чем-то вроде:

  modelBuilder.Entity<UserDetails>().HasRequired(x => x.ApplicationUser)
            .WithRequiredDependent(x => x.UserDetails);