[英]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.