【问题标题】:Entity Framework doesn't generate ApplicationUser foreign key实体框架不生成 ApplicationUser 外键
【发布时间】:2017-10-01 09:19:53
【问题描述】:

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

我正在开发一个 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; }
}

应用用户:

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 则不行。 Entity Framework 只是在没有任何 FK 约束的情况下在数据库中生成一个 int,并且在搭建 CRUD 页面时,它也不会被识别为 FK。

我对 ASP.net MVC 和 EF 还很陌生,我觉得我忽略了一些非常简单的东西。 Facepalm 时刻即将到来?

谢谢!

【问题讨论】:

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


    【解决方案1】:

    Activity 关系之所以有效,是因为其中涉及到导航属性。 Activity 有一个ICollection&lt;SignUp&gt;,因此 EF 绑定到 ActivityID 上的 SignUp 以维护该集合。 ApplicationUser 没有类似的操作。您只有一个名为ApplicationUserID 的属性; EF 不会对此做任何事情,因为它不知道它应该

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

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

    编辑

    实际上,在仔细查看您的代码之后,我认为您可能只是搞砸了ApplicationUser 上的ICollection&lt;Activity&gt;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 关系完全相同。

    【讨论】:

    • 天哪,那是我已经期待的面部护理时刻......我可能已经忽略了 Acitivity 而不是 SignUp 可能几个小时。嗯,有时候如果你看得太久,你就会开始错过一些东西。谢了哥们!感谢您的帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多