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

多重继承(可能是抽象类?)C#实体框架分享

时间:2023-04-10 22:11:20 C#

多重继承(可能是抽象类?)C#实体框架最近几周一直在使用VisualStudio2015进行c#数据库开发,基于实体框架6(代码优先)。我目前正在研究继承提供的所有选项。在这一点上,按照数据库的标准,我应该使用主键进行多重继承。这意味着什么?这意味着我应该实现一个继承自另一个类的类,并有自己的PK来识别他与父类的区别。此时我可以用TPC实现它,使父类抽象而不是在父类上定义任何PK。这是此时的代码示例(这有效,我测试过)publicabstractclassPerson{publicstringName{get;放;}publicstringLastName{get;放;}}[Table("Students")]publicclassStudent:Person{[Key]publicintId_student{get;放;}publicstringcode_s{get;放;}公共虚拟ICollection课程{get;这需要我实现另一个继承,以Student作为Parent并创建另一个继承自Student的类。我的第一个也是愚蠢的想法是让它像编写ChildOfChild:Student一样简单,但显然它没有用。然后我想到了使StudentclassAbstract成为可能的可能性,但是当我声明StudentclassAbstract时,它不让我实例化它并为表设置种子。我不确定是否有任何其他方法可以使用抽象类或任何其他方式来开发它。如果您不理解我要解决的问题,这里是我想要启动和运行的代码示例。publicabstractclassPerson{publicstringName{get;放;}publicstringLastName{get;放;}}[Table("Students")]publicclassStudent:Person{[Key]publicintId_student{get;放;}公共虚拟ICollection课程{get;放;}}[Table("ExchangeStudent")]publicclassExchangeStudent:Student{[Key]publicintId_exchange{get;放;}publicstringHomeUniversity{get;set;}}据我了解,您需要两个表,其中两个表都有自己的主键和外键来定义一对一关系。在您的C#代码中,您希望表具有继承关系。我看到您使用EntityFramework执行此操作的唯一方法是拆分您的需求。首先创建一个表示所需表结构的数据库模型。namespaceDAO{publicabstractclassPerson{publicstringName{get;放;}}publicclassStudent{publicintStudentId{get;放;}publicstring昵称{get;放;}}//使用导航属性而不是继承来定义关系publicclassExchangeStudent{publicintExchangeStudentId{get;放;}publicstringHomeUniversity{get;放;}publicvirtualStudentStudent{get;放;}}}这给了我以下代码:(),Student_StudentId=c.Int(),}).PrimaryKey(t=>t.ExchangeStudentId).ForeignKey("dbo.Student",t=>t.Student_StudentId).Index(t=>t.Student_StudentId);CreateTable("dbo.Student",c=>new{StudentId=c.Int(nullable:false,identity:true),Nickname=c.String(),Name=c.String(),}).PrimaryKey(t=>t.StudentId);}现在,如果需要在Student和ExchangeStudent之如果要建立它们之间的继承关系,可以新建一个对象命名空间BusinessObject{publicabstractclassPerson{publicstringName{get;放;}}publicclassStudent{publicintStudentId{get;放;}publicstring昵称{get;放;}}//ExchangeStudent派生自StudentpublicclassExchangeStudent:Student{publicintExchangeStudentId{get;放;}publicstringHomeUniversity{get;放;那么你只需要为这两个对象的类创建一个映射还有第三方库可以为你做这件事。您不能有两个主键。Student定义Id_student为主键,然后定义ExchangeStudentId_exchange为主键。我将在Person中实现属性“Id”并删除Id_student和Id_exchange属性。publicabstractclassStudent:Person{[Key]publicintId_student{get;放;}}publicclassLocalStudent:Student{}publicclassExchangeStudent:Student{publicstringHomeUniversity{get;set;}}但我会想到类似publicclassStudent:Person{[Key]publicintId_student{get;放;}publicstringcode_s{get;放;}公共虚拟ICollection课程{get;放;}publicExchangeInfoExchangeInfo{get;set;}}publicclassExchangeInfo:Student{[Key]publicintId_exchange{get;放;}publicStudentStudent{get;set;}publicstringHomeUniversity{get;set;}}HomeUniversity听起来像学生财产吗?使用单个学生表而不是从2个表中选择2个来找出谁真正在听课程以及如何创建像课程这样的表到两个表Student和ExchangeStudent的链接更方便?不会有id吗?如果不是,请给Person一个Id属性。在您的FluentAPI中定义您对TPC进行建模,即此ID是您的学生和交换生的主密钥。publicclassPerson{publicintId{get;放;公共字符串名称{得到;放;}publicstringLastName{get;放;}}publicclassStudent:Person{//主键在基类中publicstringcode_s{get;放;}公共虚拟ICollection课程{get;放;}}publicclassExchangeStudent:Student{//主键在基类之一中publicstringHomeUniversity{get;set;}}您的DbContext配置此链接中的TPCclassMyDbContext:DbContext{publicDbSetStudents{get;设置;}公共DbSetExchangeStudents{get;set;}protectedoverrideOnModelCreating(...){//将Student和ExcahngeStudent配置为TPC,//如果需要定义主键modelBuilder.Entity().HasKey(student=>student.Id).Map(m=>{m.MapInheritedProperties();m.ToTable("学生");});modelBuilder.Entity().HasKey(student=>student.Id).Map(m=>{m.MapInheritedProperties();m.ToTable("ExchangeStudents");});}我不确定是否需要HasKey。因为主键随命命名约定,所以可能不需要它。在使用属性之上使用流畅的API的优势在于,它允许您在不同的数据库模型中使用相同的类和查询,只需指定不同的DbContext。以上就是C#学习教程:多重继承(也许是抽象类?)C#实体框架分享的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: