当前位置: 首页 > 编程语言 > C#

FluentAPI-数据注解中如何使用实体框架定义外键可选关系?Share

时间:2023-04-11 01:54:45 C#

如何使用实体框架在FluentAPI/DataAnnotations中定义外键可选关系?我有一个包含以下代码的(示例)应用程序:publicclassPosts{[Key][Required]publicintID{get;放;}[必需]publicstringTypeOfPost{get;放;}publicintPollID{得到;放;}publicvirtualPollPoll{get;放;}publicintPostID{得到;放;}publicvirtualPostPost{get;放;基本上,我不知道是否有更好的方法来做到这一点,但是,我有一个帖子列表,人们可以选择是Poll还是Post,因为实体框架不适用于Enums,我只需将其存储为TypeOfPost的字符串,然后在应用程序中,我将其基于TypeOfPost的值并以编程方式查询Poll或Post。我认为无论如何都可以设置“只有一个”或类似的,所以,我处理应用程序中的所有检查和内容。(如果有人知道更好的方法,请说出来!)。无论如何,问题是,通过进入SQLManagementStudio并手动编辑架构以允许空值,我让它工作了——但是,我只是不知道如何在FluentAPI中执行此操作并需要一些帮助。我尝试了以下两种方法:modelBuilder.Entity().HasOptional(x=>x.Poll).WithOptionalDependent();modelBuilder.Entity().HasOptional(x=>x.Poll).WithOptionalPrincipal();第一个似乎在数据库中创建了一个允许空值的附加列,而第二个似乎什么也没做。我相信第一个是我需要的,但是,我需要在Post类中将它与[ForeignKey]结合使用。如果我在这里是正确的,[ForeignKey]应该是虚拟财产还是财产的ID?另外,WithOptionalDependent和WithOptionalPrincipal之间的实际区别是什么?-我看过MSDN,但是,我真的不明白其中的区别。我可能会尝试创建两个一对一关系作为可选:必需,因为Poll必须引用Posts,而Post也必须引用Posts:modelBuilder.Entity().HasOptional(x=>x.Post).WithRequired();modelBuilder.Entity().HasOptional(x=>x.Poll).WithRequired();这使得Posts自动成为关系中的主体以及Post或Poll依赖项。主体在关系中有一个主键,依赖外键也是Post/Poll表中的主键,因为它是一对一的关系。只有在一对多关系中,您才能拥有单独的外键列。对于一对一关系,您还必须删除外键列PostId和PollId,因为Posts通过它们的主键引用Post和Poll。在您的模型中似乎合适的替代方法是继承映射。然后模型看起来像这样:publicabstractclassBasePost//yourformerPostsclass{publicintID{get;放;}publicstring用户名{get;放;}}publicclassPost:BasePost{publicstringText{get;放;}//Post类的其他属性}publicclassPoll:BasePost{//Poll类的属性}您不再需要TypeOfPost,因为您可以使用OfTypeLINQ运算符来过滤两种具体类型,例如:varx=context.BasePosts.OfType().Where(p=>p.UserName=="Jim").ToList();这将选择特定用户的所有帖子,但不选择民意调查。您必须决定使用哪个继承映射-TPH、TPT或TPC。编辑要获得一对多关系,您可以在FluentAPI中指定以下映射:modelBuilder.Entity().HasOptional(x=>x.Post).WithMany().HasForeignKey(x=>x.PostID);模型构建器。实体().HasOptional(x=>x.Poll).WithMany().HasForeignKey(x=>x.PollID);正如您已经发现的,外键属性必须可以为空(int?)。由于外键属性的命名遵循EF用于映射的命名约定,因此可以完全省略Fluent映射。只有当你有非常规的名字(比如PostFK之类的)时你才需要它。然后您还可以使用数据注释([ForeignKey(...)]属性)代替FluentAPI。不允许空值,原因如下:publicintPollID{get;放;}publicvirtualPollPoll{get;放;}publicintPostID{得到;放;}publicvirtualPostPost{get;放;}会是}publicint?轮询ID{得到;放;}publicvirtualPollPoll{get;放;公共诠释?PostID{得到;放;}publicvirtualPostPost{get;放;ForeignKey必须是Nullable才能使其成为可选的——Virtuals是独立的,只需要延迟加载。声明性EF代码中的必需关系First:publicUserUser{get;放;}[ForeignKey("User")]publicintUserId{get;放;}声明性EF代码中的可选关系优先:publicUserUser{get;放;}[ForeignKey("User")]publicint?UserId{得到;放;当你运行update-database-verbose-f时,你会看到这个:ALTERTABLE[dbo].[MyTable]ALTERCOLUMN[UserId][int]NULL其他可能有帮助的东西。使用[Required]属性设置外键属性(注释)也将为EF强制执行所需的导航属性,即使FK属性可以为null。我有一个遗留数据的特殊情况,其中需要FK属性,但可能会或可能不会引用关系中的记录。有道理,但我认为EF并不“聪明”。以上是C#学习教程:FluentAPI/数据注解中如何使用实体框架定义外键可选关系?分享的所有内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——【必读】本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: