entity framework不生成ApplicationUser外键
注意:对于这个问题,我稍微简化了模型。
我正在使用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(); } public int ActivityID { get; set; } [Required] [StringLength(50)] [Display(Name = "Naam")] public string Name { get; set; } public virtual ICollection SignUps { get; set; } }
ApplicationUser:
public class ApplicationUser : IdentityUser { public ApplicationUser() { Activities = new HashSet(); } [Required] [Display(Name = "Voornaam")] public string FirstName { get; set; } [Required] [Display(Name = "Achternaam")] public string LastName { get; set; } public virtual ICollection 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瞬间传入?
谢谢!
Activity
关系有效,因为您有导航属性。 Activity
具有ICollection
,因此EF绑定到SignUp
上的ActivityID
以维护该集合。 与ApplicationUser
没有任何相似之处。 你只有一个名为ApplicationUserID
的属性; EF不会对此做任何事情,因为它不知道应该做什么。
只需添加一个导航属性,你会很好:
[ForeignKey("ApplicationUser")] public int ApplicationUserID { get; set; } public ApplicationUser ApplicationUser { get; set; }
编辑
实际上,在查看了你的代码之后,我想你可能刚刚搞砸了ApplicationUser
上的ICollection
。 ApplicationUser
和Activity
之间没有直接关系。 这种关系来自SignUp
,它基本上是一个带有效载荷的M2M。 因此,您应该具有以下内容:
public class ApplicationUser : IdentityUser { public ApplicationUser() { Activities = new HashSet(); } [Required] [Display(Name = "Voornaam")] public string FirstName { get; set; } [Required] [Display(Name = "Achternaam")] public string LastName { get; set; } public virtual ICollection SignUps { get; set; } }
然后,它的function与您当前的Activity
关系完全相同。