标题可能过于通用,但我对如何基于关系数据库设计C#类有一个非常具体的问题。
假设我们有一个名为TPerson的表和一个名为TComment的表,两个表都有一个共同的列(PERSON_ID,TPerson上的PK和TComment中的FK)。
假设我们有一个网络应用程序,我们在其中显示一个显示所有人的评论的列表,在此列表中我们显示评论以及作者的名字和姓氏(TPerson)以及评论的创建日期同样。我认为使用继承(基类TPerson,派生类TComment)是不合适的,因为我不需要别名,例如,如果我只需要名字和名字,我不想随意拖动其他列(列TPerson可能有很多列)。
我想要一个能够:
的课程设计是否有办法通过仅检索或使用对象的某些部分来创建可重用代码?
执行此操作的唯一方法是使用继承,每次我检索一个Comment时,我也会创建与它一起使用的Person对象,但在某些部分,当我只检索整个东西时会有些过分。需要它的某些部分......
如果我要创建表示数据的类,我会选择这样的东西,任何想法?,谢谢你的帮助!:
class Person
{
int personId;
string firstName;
string lastName;
string alias;
DateTime creationDate;
public int PersonId
{
get { return personId; }
}
public string FirstName
{
get { return firstName; }
set { firstName = value; }
}
public string LastName
{
get { return lastName; }
set { lastName = value; }
}
public string Alias
{
get { return alias; }
set { alias = value; }
}
public DateTime CreationDate
{
get { return creationDate; }
}
//for adding new person object
public Person(string first_name, string last_name, string alias)
{
}
//internal usage
public Person()
{
}
public void Save()
{
//save new person object in DB or update...
}
public static Person GetPerson(int personId)
{
Person p = null;
//call sproc and load from database...
p = new Person();
p.personId = 10;
p.firstName = "First Name";
p.lastName = "Last Name";
p.alias = "Alias";
return p;
}
}
class Comment
{
int commentId;
int personId;
string comment;
DateTime creationDate;
public int CommentId
{
get { return commentId; }
set { commentId = value; }
}
public int PersonId
{
get { return personId; }
set { personId = value; }
}
public string Comment1
{
get { return comment; }
set { comment = value; }
}
public DateTime CreationDate
{
get { return creationDate; }
set { creationDate = value; }
}
public Comment(int person_id, string comment)
{
}
public Comment()
{
}
public void Save()
{
//save or update to DB
}
public static List<Comment> GetComments()
{
List<Comment> comments = null;
//get data from db and load...
comments = new List<Comment>();
comments.Add(new Comment() {
commentId = 1,
personId = 10,
comment = "this is one comment",
CreationDate = DateTime.Now });
comments.Add(new Comment() {
commentId = 1,
personId = 11,
comment = "this is another comment",
CreationDate = DateTime.Now });
return comments;
}
}
答案 0 :(得分:2)
其实为什么不使用实体框架?它将您的数据库视为对象。
编辑: 基本上,您可以使用实体框架为您创建数据库对象 它可以将您的表映射到对象,TComments,TPerson对象等。 并用你的外键创建它们之间的关系。
即在您的情况下,因为您的TPerson表包含TComments的Foregin Keys。 Entity Framework创建的TPerson对象将包含每个TPerson的TComment集合。你只需编写LINQ即可将其删除。
当您修改这些对象时,您只需要执行实体容器的Save()方法,它将保存到数据库中。
答案 1 :(得分:0)
这似乎是one-to-many关联。我不会在这里使用继承。
我将使用的是ORM framework。我建议使用Entity Framework。
步骤1:使用您提供的架构创建数据库(实际上您也可以从代码或模型开始,但这是另一个主题)
步骤2:在Visual Studio中导入数据库并从中创建实体模型。这将创建表示对象的类(称为“实体”)。这是数据库表与您在应用程序中操作的对象之间的映射。
第3步:就是这样。现在,您可以使用以下行来检索数据库中的所有注释:
foreach (Comment comment in MyContext.Comments)
{
// Here you have access to the associated Person
Person = comment.Person;
}
由于一对多的关联,也很容易获得与一个人相关的所有评论:
var comments = Person.Comments;
答案 2 :(得分:0)
这绝对不是继承的典型案例 - 通常,您希望使用继承来反映“是一种”关系 - 例如“汽车是一种载体”。没有合理的方式可以说“评论是一个人”;当然,你可以说评论和人都是“你可以存储到数据库中的东西”。
虽然我同意King Chan和ken2k,你可能想要使用现有的ORM工具,但首先要阅读OO设计的基本概念。我推荐Craig Larman的书“应用UML和模式” - 它与技术无关,但对如何将对象映射到数据库有很好的描述。