簡體   English   中英

mvc和帶有ApplicationUser表的實體框架中的一對一或一對零關系

[英]one to one or one to zero relationship in mvc and entity framework with ApplicationUser table

我想在MVC中的“個人”表和“用戶”表之間設置一對一或一對零關系。 這是我的個人課堂代碼:

 public class Personal
{
 #region Configuration
    internal class Configuration : System.Data.Entity.ModelConfiguration.EntityTypeConfiguration<Personal>
    {
        public Configuration()
        {   
            HasRequired(current => current.ApplicationUser)
                .WithOptional(user => user.PersonalU)
                .WillCascadeOnDelete(true);
        }
    }
    #endregion Configuration
public string UserName { get; set; }
    [Key,ForeignKey("ApplicationUserID")]
    public string ApplicationUserID { get; set; }
    public virtual ApplicationUser ApplicationUser { get; set; }
}

這是ApplicationUser代碼:

  public class ApplicationUser : IdentityUser
{
public virtual Personal PersonalU { get; set; }
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        return userIdentity;
    }
}

但是當我使用“個人”表添加控制器時,出現錯誤“不支持每種類型的多個對象集。對象集'ApplicationUsers'和'Users'都可以包含類型為'WebApplication1.Models.ApplicationUser'的實例。” 已經完成了。

代替

[Key,ForeignKey("ApplicationUserID")]
public string ApplicationUserID { get; set; }
public virtual ApplicationUser ApplicationUser { get; set; }

設置這個

public string ApplicationUserID { get; set; }
[ForeignKey("ApplicationUserID")]
public virtual ApplicationUser ApplicationUser { get; set; }

我猜您正在嘗試將ApplicationUser顯式地放置在DbContext ,但是您的DbContext可能繼承自IdentityDbContext ,后者已經為IdentityUser設置了數據庫。

不要這樣做:

public class MyAwesomeContext : IdentityDbContext<ApplicationUser>
{
    public DbSet<ApplicationUser> ApplicationUsers { get; set; } // this shouldn't exist 
    public DbSet<Personal> Personals { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new Configuration());
    }
}

我建議將Configuration重命名為PersonalConfiguration或其他名稱,否則有人可能會認為它是Migrations中的配置。

由於IdentityDbContext<>已經為您在IdentityDbContext指定的TUser類型聲明了DbSet ,因此只需省略ApplicationUser數據庫集,如下所示:

public class MyAwesomeContext : IdentityDbContext<ApplicationUser>
{
    public DbSet<Personal> Personals { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder); // don't forget this...
        modelBuilder.Configurations.Add(new Configuration());
    }
}

確保將ApplicationUser放在IdentityDbContext<>泛型的類型內。


另外,您的Personal類必須定義一個鍵,您可以在EntityTypeConfiguration以下操作:

internal class Configuration : System.Data.Entity.ModelConfiguration.EntityTypeConfiguration<Personal>
{
    public Configuration()
    {
        HasKey(p => p.ApplicationUserID);

        HasRequired(current => current.ApplicationUser)
            .WithOptional(user => user.PersonalU)
            .WillCascadeOnDelete(true);
    }
}

...並從您的班級中刪除[Key,ForeignKey("ApplicationUserID")] ,因為您已經在使用fluent api了

嘗試使用EF 6.0實現此目的-檢查是否有用

public class Personal
    {
        public string UserName { get; set; }

        public string ApplicationUserID { get; set; }

        [ForeignKey("ApplicationUserID")]
        public virtual ApplicationUser ApplicationUser { get; set; }
    }


public class ApplicationUser : IdentityUser
    {
        [Key]
        public string ApplicationUserID { get; set; }
        public virtual Personal PersonalU { get; set; }
    }


protected override void OnModelCreating(DbModelBuilder builder)
        {
            builder.Entity<Personal>()
                .HasKey(m => m.ApplicationUserID);

                builder.Entity<ApplicationUser>()
                .HasRequired(current => current.PersonalU)
                .WithOptional(user => user.ApplicationUser)
                .WillCascadeOnDelete(true);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM