我使用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
中的 OnModelCreatingprotected 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新技术 中做出这样的事情。
答案 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说。
答案 2 :(得分:0)
如果您真的想创建一个名为Address的表,而不是创建一个名为Address的属性作为AspNetUsers表的一列生成,请执行以下操作(obs:在这种情况下,我假设用户可以有多个地址):>
在您的地址课上:
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; }
}
您的ApplicationUser类:
public virtual ICollection<Address> Addresses { get; set; }
在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
希望这会有所帮助!