首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Microsoft.AspNet.Identity.EntityFramework.IdentityUser?的外键

Microsoft.AspNet.Identity.EntityFramework.IdentityUser?的外键
EN

Stack Overflow用户
提问于 2013-11-21 02:43:34
回答 6查看 15.2K关注 1票数 10

我在VS2013中,刚刚创建了一个MVC应用程序。

我正在创建一个对象,希望在结果数据库中有一个指向AspNetUsers表的外键。该项目确实有一个ApplicationUser (从IdentityUser派生而来),它看起来与AspNetUsers表的属性列匹配。

我们如何正确地声明一个外键呢?

代码语言:javascript
复制
public MyObject
{
   public string UserId { get; set; }

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

   // other properties
}

现在,我将ApplicationUser修改为拥有一个MyObjects集合:

代码语言:javascript
复制
public ApplicationUser : IdentityUser
{
     public virtual ICollection<MyObject> MyObjects { get; set; }    
}

这似乎是如何在EF代码中先做一对多。但是,当我更新数据库时,我得到的错误是标识成员(IdentityUserLogin、IdentityUserRole等)。未定义任何键。也许这些课程并不意味着要参与EF Code First迁移?

我可以“到后面”,通过SQL语句添加外键,但是如果我想先从Code First更新,我可能会得到错误(数据库当前与旧的迁移或类似的东西不匹配)。

我们如何正确地外键引用这些成员资格表?

我还尝试用AspNetUsers表的匹配属性创建一个AspNetUser类。我在客户机类上声明了“公共ApplicationUser”,而不是“公共AspNetUser”。这样做会导致迁移失败-“没有应用自动迁移,因为它会导致数据丢失。”

那么,该怎么办呢?

EN

回答 6

Stack Overflow用户

发布于 2016-10-13 07:06:37

很容易在ApplicationUserMyObject之间创建一对多关系,并在MyObjects表中添加一个"UserId“外键。我喜欢这个解决方案的原因是它遵循EF约定,并且在你的模型中不需要[ForeignKey]属性:

代码语言:javascript
复制
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“。

票数 4
EN

Stack Overflow用户

发布于 2015-03-12 20:45:42

我将执行以下操作:在ApplicationUser类中,添加一个ForeignKey属性,

代码语言:javascript
复制
public ApplicationUser : IdentityUser {
    [ForeignKey("UserID")]
    public virtual ICollection<MyCustomUser> MyCustomUsers{ get; set; }    
}

在您想要跟踪它所属的用户的模型中,

代码语言:javascript
复制
public MyObject {
    public string UserId { get; set; }

    // other properties
}

您不需要将整个ApplicationUser实例存储在MyObject类中,UserID将自动生成。重要的是,is的类型是stringApplicationUserID也是如此!

票数 2
EN

Stack Overflow用户

发布于 2014-10-30 06:17:10

代码语言:javascript
复制
public MyObject
{
   .. other properties

   [MaxLength(128), ForeignKey("ApplicationUser")]
   public virtual string UserId { get; set; }

   public virtual ApplicationUser ApplicationUser { get; set;}
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20104289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档