C#面向对象的编程,继承,外键和DB

时间:2012-01-03 16:09:10

标签: c# database inheritance relational

标题可能过于通用,但我对如何基于关系数据库设计C#类有一个非常具体的问题。

假设我们有一个名为TPerson的表和一个名为TComment的表,两个表都有一个共同的列(PERSON_ID,TPerson上的PK和TComment中的FK)。

假设我们有一个网络应用程序,我们在其中显示一个显示所有人的评论的列表,在此列表中我们显示评论以及作者的名字和姓氏(TPerson)以及评论的创建日期同样。我认为使用继承(基类TPerson,派生类TComment)是不合适的,因为我不需要别名,例如,如果我只需要名字和名字,我不想随意拖动其他列(列TPerson可能有很多列)。

我想要一个能够:

的课程设计
  1. 添加Person对象并保存到DB
  2. 添加评论对象并保存到DB
  3. 检索具有该人的名字和姓氏的评论列表
  4. 是否有办法通过仅检索或使用对象的某些部分来创建可重用代码?

    执行此操作的唯一方法是使用继承,每次我检索一个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;
        }
    }
    

3 个答案:

答案 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和模式” - 它与技术无关,但对如何将对象映射到数据库有很好的描述。