首页 文章

实体框架不生成ApplicationUser外键

提问于
浏览
1

注意:对于这个问题,我已经简化了一些模型 .

我正在使用ASP.NET Core MVC应用程序(使用Entity Framework Core) . 我有三个型号 . 我有一个ApplicationUser(从IdentityUser扩展),我有一个Activity模型,我有一个'SignUp'模型,它有一个活动的外键和ApplicationUser的外键 . 至少,这就是主意 . 问题是,Entity Framework将Activity FK识别为FK,而不是applicationuser . 这只是数据库中的另一个int而没有任何FK约束 .

我尝试了很多我在互联网上找到的东西,但我无法让它发挥作用 . 这是我目前所拥有的(为了清晰起见缩短):

活动:

public class Activity
{
    public Activity()
    {
        SignUps = new HashSet<SignUp>();
    }

    public int ActivityID { get; set; }

    [Required]
    [StringLength(50)]
    [Display(Name = "Naam")]
    public string Name { get; set; }

    public virtual ICollection<SignUp> SignUps { get; set; }
}

ApplicationUser:

public class ApplicationUser : IdentityUser
{
    public ApplicationUser()
    {

        Activities = new HashSet<Activity>();
    }

    [Required]
    [Display(Name = "Voornaam")]
    public string FirstName { get; set; }

    [Required]
    [Display(Name = "Achternaam")]
    public string LastName { get; set; }

    public virtual ICollection<Activity> Activities { get; set; }
}

注册:

public class SignUp
{
    public int SignUpID { get; set; }

    [Required]
    public int ActivityID { get; set; }

    [ForeignKey("ApplicationUser")]
    public int ApplicationUserID { get; set; }

    [Required]
    public string Status { get; set; }
}

注意:我首先没有[ForeignKey]属性(与活动一样),但它就在那里,因为我试图让它工作 .

正如我上面所说,SignUp中的Activity FK工作正常,Applicationuser FK没有 . 实体框架只在数据库中生成一个没有任何FK约束的int,并且当脚手架CRUD页面时,它也不被识别为FK .

我是ASP.net MVC和EF的新手,我觉得我忽略了一些非常简单的事情 . Facepalm瞬间传入?

谢谢!

1 回答

  • 2

    Activity 关系有效,因为您在那里涉及导航属性 . ActivityICollection<SignUp> ,因此EF绑定到 SignUp 上的 ActivityID 以维护该集合 . ApplicationUser 没有类似的事情 . 你刚才有一个名为 ApplicationUserID 的房产; EF不会对此做任何事情,因为它不知道应该这样做 .

    只需添加一个导航属性,你就会很好:

    [ForeignKey("ApplicationUser")]
    public int ApplicationUserID { get; set; }
    public ApplicationUser ApplicationUser { get; set; }
    

    EDIT

    实际上,在看了你的代码之后,我想你可能刚刚搞砸了 ICollection<Activity> 上的 ICollection<Activity> . ApplicationUserActivity 之间没有直接关系 . 这种关系来自 SignUp ,它基本上是一个有效载荷的M2M . 因此,您应该具有以下内容:

    public class ApplicationUser : IdentityUser
    {
        public ApplicationUser()
        {
    
            Activities = new HashSet<Activity>();
        }
    
        [Required]
        [Display(Name = "Voornaam")]
        public string FirstName { get; set; }
    
        [Required]
        [Display(Name = "Achternaam")]
        public string LastName { get; set; }
    
        public virtual ICollection<SignUp> SignUps { get; set; }
    }
    

    然后,它的功能与您当前的 Activity 关系完全相同 .

相关问题