注意:对于这个问题,我稍微简化了模型。
我正在开发 ASP.NET Core MVC 应用程序(使用 Entity Framework Core)。我有三个模型。我有一个 ApplicationUser (从 IdentityUser 扩展),我有一个 Activity 模型,我有一个“SignUp”模型,该模型具有事件的外键和 ApplicationUser 的外键。至少,这是我的想法。问题是, Entity Framework 将 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; }
}
注册:
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] 属性(就像 Activity 一样),但它在那里是因为我试图让它工作。
正如我上面所说,SignUp 中的 Activity FK 工作正常,而 Applicationuser FK 则不行。 Entity Framework 只是在数据库中生成一个 int,没有任何 FK 约束,并且在搭建 CRUD 页面时,它也不会被识别为 FK。
我对 ASP.net MVC 和 EF 很陌生,我感觉我忽略了一些非常简单的东西。捂脸瞬间来了?
谢谢!
最佳答案
Activity
关系之所以有效,是因为其中涉及导航属性。 Activity
有一个 ICollection<SignUp>
,因此 EF 绑定(bind)到 ActivityID
上SignUp
维护该集合。 ApplicationUser
没有做任何类似的事情。 。您只有一个名为 ApplicationUserID
的属性; EF 不会对此做任何事情,因为它不知道它应该。
只需添加一个导航属性即可:
[ForeignKey("ApplicationUser")]
public int ApplicationUserID { get; set; }
public ApplicationUser ApplicationUser { get; set; }
编辑
实际上,在仔细查看您的代码后,我认为您可能刚刚搞砸了 ICollection<Activity>
上ApplicationUser
。 ApplicationUser
之间没有直接关系和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
完全相同目前关系确实如此。
关于c# - Entity Framework 不生成 ApplicationUser 外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43761801/