如何添加ASP.Net MVC 5 Identity的外键引用?

时间:2014-03-10 10:04:46

标签: entity-framework

我使用ASP.Net Identity创建了一个新的ASP.NET MVC 5.1项目。 这似乎是可靠和有希望的,但是如果使用SQL,今天我花了将近9个小时做一些简单的事情。

我的问题是,我不能通过CodeFirst创建一个表,并使用外键引用默认的AspNetUsers表。

例如: 我创建了一个名为 - 地址

的表
   public class Address
    {
        [Key]
        public string UserId { get; set; }
        public string MyAddress { get; set; }
    }

但是如何创建 AspNetUsers 的外键引用?

我尝试用

替换上面的属性
public IdentityUser MyAddress { get; set; }
// Or
public virtual IdentityUser MyAddress { get; set; }
// Or
public virtual ApplicationUser MyAddress { get; set; }

但他们所有人仍然显示错误:

One or more validation errors were detected during model generation:

MiaPos.Models.IdentityUserLogin: : EntityType 'IdentityUserLogin' has no key defined. Define the key for this EntityType. 
MiaPos.Models.IdentityUserRole: : EntityType 'IdentityUserRole' has no key defined. Define the key for this EntityType. 
IdentityUserLogins: EntityType: EntitySet 'IdentityUserLogins' is based on type 'IdentityUserLogin' that has no keys defined. 
IdentityUserRoles: EntityType: EntitySet 'IdentityUserRoles' is based on type 'IdentityUserRole' that has no keys defined.

我也尝试覆盖此post

中的 OnModelCreating
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
    modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id);
    modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });
}

但是当我运行添加迁移时,它会创建IdentityUserLogin,IdentityRole,IdentityUserRole表并重复,只是前缀不同。 (ASPNET&LT; - &GT;标识)

最后我用SQL在10秒内完成,但我只是想知道为什么我在CodeFirst中无法做到? 为什么很难从 Microsoft 2014新技术 中做出这样的事情。

enter image description here

3 个答案:

答案 0 :(得分:29)

你可以这样做。因为有时你可能需要1-1连接

 public class AnotherTable
    {
        [Key]
        public string UserId { get; set; }

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

答案 1 :(得分:25)

感谢GáborPlesz以上的评论。

我找到了解决方案。

继承 IdentityUser (创建AspNetUsers表)的ApplicationUser类应该创建子类(子表)的ICollection属性。

e.g。

public virtual ICollection<ToDo> ToDoes { get; set; }

所以 ToDo 类可以引用 ApplicationUser

强烈建议您查看样本GáborPlesz说。

enter image description here

答案 2 :(得分:0)

如果您真的想创建一个名为Address的表,而不是创建一个名为Address的属性作为AspNetUsers表的一列生成,请执行以下操作(obs:在这种情况下,我假设用户可以有多个地址):

  1. 在您的地址课上:

    public class Address
    {
        public string MyAddress { get; set; }
    
        // referencing the AspNetUsers table ( ApplicationUser.cs)
        public string UserId { get; set; }
        public virtual ApplicationUser User { get; set; }
    }
    
  2. 您的ApplicationUser类:

    public virtual ICollection<Address> Addresses { get; set; }
    
  3. 在OnModelCreating方法的DBContext中执行以下操作(流畅的API):

    builder.Entity<Address>()
                  .HasOne(c => c.User)
                  .WithMany(x => x.Addresses)
                  .HasForeignKey(f => f.UserId)
                  .HasConstraintName("UserId")
                  .OnDelete(DeleteBehavior.Cascade)
                  .IsRequired();
    

OBS:不要忘记在OnModelCreating方法上方添加以下代码行:

public DbSet<Address> Addresses { get; set; }

在程序包管理器控制台中运行这些命令之后:

Add-Migrations UserAddress

及之后:

Update-Database. 

但是,如果您只想为AspNet用户添加一个新属性,只需在ApplicationUser.cs文件/类中创建此属性:

public class ApplicationUser : IdentityUser
    {
        public string Address { get; set; }
    }

并为您的PMC运行相同的命令:

Add-Migration UserAddress

之后:

Update-Database

希望这会有所帮助!