C # объектно-ориентированное программирование, наследование, внешние ключи и БД - PullRequest
0 голосов
/ 03 января 2012

заголовок может быть слишком общим, но у меня есть очень специфический вопрос о том, как проектировать классы C # на основе реляционной базы данных.

Допустим, у нас есть таблица с именем TPerson и таблица с именем TComment, обатаблицы имеют один общий столбец (PERSON_ID, PK в TPerson и FK в TComment).

Допустим, у нас есть веб-приложение, в котором мы отображаем список, показывающий все комментарии от всех, в этом списке мы показываемкомментарий, а также имя и фамилия автора (TPerson), а также дата создания комментария.Я думаю, что нецелесообразно использовать наследование (базовый класс TPerson, производный класс TComment), потому что мне не нужен псевдоним, например, я не хочу перетаскивать другие столбцы со мной, если мне нужны только имя и фамилия(столбец TPerson может иметь много столбцов).

Мне нужен дизайн класса, который может:

  1. Добавить объекты Person и сохранить в БД
  2. Добавить объекты Комментарий и сохранить в БД
  3. Получить список комментариев с именем и фамилией человека

Есть ли способ создать повторно используемый код, только получая или используя части объекта?

Единственный способ сделать это - использовать наследование, и каждый раз, когда я получаю Комментарий, я также создаю объект 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 ]

2 голосов
/ 03 января 2012

На самом деле, почему бы не использовать структуру сущностей? Он обрабатывает вашу базу данных как объекты.

Edit: По сути, вы можете использовать Entity Framework для создания объектов базы данных для вас.
Он может отображать вашу таблицу в объекты, TComments, объекты TPerson и т. Д. И создает отношения между ними с помощью вашего ключа.

Т.е. в вашем случае, потому что ваша таблица TPerson содержит Foregin Keys of TComments. Объект TPerson, созданный Entity Framework, будет содержать коллекцию TComment для каждого TPerson. Вам нужно будет только написать LINQ, чтобы убрать их.

И когда вы изменяете эти объекты, вам нужно только выполнить метод Save () контейнера сущностей, и он сохранится в базе данных.

0 голосов
/ 03 января 2012

Это определенно не классический случай наследования - обычно вы хотите использовать наследование, чтобы отразить отношения «это» - например, «автомобиль - это транспортное средство».Нет логичного способа сказать «комментарий - это человек»;Вы, конечно, можете сказать, что и комментарий, и человек - это «вещи, которые вы можете сохранить в базе данных».

Хотя я и с King Chan, и с ken2k согласен, что вы, вероятно, захотите использовать для этого существующий инструмент ORM, это поможет вначале ознакомиться с основополагающими концепциями проектирования ОО.Я бы порекомендовал книгу Крейга Лармана «Применение UML и шаблонов» - она ​​не зависит от технологий, но содержит отличное описание того, как отображать объекты в базу данных.

0 голосов
/ 03 января 2012

Похоже, это связь один-ко-многим . Я бы здесь не использовал наследование.

Я бы использовал 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;
...