我在VS2013中,刚刚创建了一个MVC应用程序。
我正在创建一个对象,希望在结果数据库中有一个指向AspNetUsers表的外键。该项目确实有一个ApplicationUser (从IdentityUser派生而来),它看起来与AspNetUsers表的属性列匹配。
我们如何正确地声明一个外键呢?
public MyObject
{
public string UserId { get; set; }
[ForeignKey("UserId")]
public ApplicationUser User { get; set;}
// other properties
}
现在,我将ApplicationUser修改为拥有一个MyObjects集合:
public ApplicationUser : IdentityUser
{
public virtual ICollection<MyObject> MyObjects { get; set; }
}
这似乎是如何在EF代码中先做一对多。但是,当我更新数据库时,我得到的错误是标识成员(IdentityUserLogin、IdentityUserRole等)。未定义任何键。也许这些课程并不意味着要参与EF Code First迁移?
我可以“到后面”,通过SQL语句添加外键,但是如果我想先从Code First更新,我可能会得到错误(数据库当前与旧的迁移或类似的东西不匹配)。
我们如何正确地外键引用这些成员资格表?
我还尝试用AspNetUsers表的匹配属性创建一个AspNetUser类。我在客户机类上声明了“公共ApplicationUser”,而不是“公共AspNetUser”。这样做会导致迁移失败-“没有应用自动迁移,因为它会导致数据丢失。”
那么,该怎么办呢?
发布于 2016-10-13 07:06:37
很容易在ApplicationUser
和MyObject
之间创建一对多关系,并在MyObjects
表中添加一个"UserId“外键。我喜欢这个解决方案的原因是它遵循EF约定,并且在你的模型中不需要[ForeignKey]
属性:
public class ApplicationUser : IdentityUser
{
public virtual ICollection<MyObject> MyObjects { get; set; }
}
public class MyObject
{
public int MyObjectId { get; set; }
public string MyObjectName { get; set; }
// other properties
public virtual ApplicationUser ApplicationUser { get; set; }
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
}
public DbSet<MyObject> MyObjects { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<MyObject>()
.HasRequired(c => c.ApplicationUser)
.WithMany(t => t.MyObjects)
.Map(m => m.MapKey("UserId"));
}
}
注意,使用Fluent API在MyObjects
表中创建了一个"UserId“外键。这个解决方案仍然可以在不添加Fluent API的情况下工作,但是按照惯例,您的外键列将在MyObjects
表中命名为"ApplicationUser_Id“。
发布于 2015-03-12 20:45:42
我将执行以下操作:在ApplicationUser
类中,添加一个ForeignKey
属性,
public ApplicationUser : IdentityUser {
[ForeignKey("UserID")]
public virtual ICollection<MyCustomUser> MyCustomUsers{ get; set; }
}
在您想要跟踪它所属的用户的模型中,
public MyObject {
public string UserId { get; set; }
// other properties
}
您不需要将整个ApplicationUser
实例存储在MyObject
类中,UserID
将自动生成。重要的是,is的类型是string
,ApplicationUser
的ID
也是如此!
发布于 2014-10-30 06:17:10
public MyObject
{
.. other properties
[MaxLength(128), ForeignKey("ApplicationUser")]
public virtual string UserId { get; set; }
public virtual ApplicationUser ApplicationUser { get; set;}
}
https://stackoverflow.com/questions/20104289
复制相似问题