实体框架不会生成ApplicationUser外键

时间:2017-05-03 13:41:03

标签: c# asp.net asp.net-mvc entity-framework foreign-keys

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

我正在使用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 个答案:

答案 0 :(得分:2)

Activity关系有效,因为您有导航属性。 Activity有一个ICollection<SignUp>,因此EF会绑定ActivityID上的SignUp来维护该集合。与ApplicationUser没有任何相似之处。你只有一个名为ApplicationUserID的财产; EF不会对此做任何事情,因为它不知道应该

只需添加一个导航属性即可:

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

修改

实际上,在仔细查看您的代码之后,我想您可能已经对ICollection<Activity>上的ApplicationUser搞砸了。 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关系的功能完全相同。