实体框架不生成 ApplicationUser 外键

2024-02-04

注意:对于这个问题,我稍微简化了模型。

我正在开发 ASP.NET Core MVC 应用程序(使用 Entity Framework Core)。我有三个模型。我有一个 ApplicationUser (从 IdentityUser 扩展),我有一个 Activity 模型,我有一个“SignUp”模型,该模型具有活动的外键和 ApplicationUser 的外键。至少,这是我的想法。问题是,实体框架将 Activity FK 识别为 FK,但不将应用程序用户识别为 FK。这只是成为数据库中的另一个 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; }
}

应用用户:

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; }
}

SignUp:

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 则不行。实体框架只是在数据库中生成一个 int,没有任何 FK 约束,并且在构建 CRUD 页面时,它也不会被识别为 FK。

我对 ASP.net MVC 和 EF 很陌生,我感觉我忽略了一些非常简单的东西。捂脸瞬间来了?

Thanks!


The Activity关系之所以有效,是因为其中涉及导航属性。Activity has an ICollection<SignUp>,所以 EF 绑定到ActivityID on SignUp维护该集合。没有做任何类似的事情ApplicationUser。你只有一个名为ApplicationUserID; EF 不会对此做任何事情,因为它不知道这一点should.

只需添加一个导航属性就可以了:

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

EDIT

实际上,在仔细查看了您的代码之后,我认为您可能只是搞砸了ICollection<Activity> on ApplicationUser。之间没有直接关系ApplicationUser and Activity。这种关系是通过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目前关系确实如此。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体框架不生成 ApplicationUser 外键 的相关文章

随机推荐