C Sharp Object создает и ссылается только на 1 объект в другом классе - PullRequest
0 голосов
/ 07 октября 2011

Мне нужно реализовать отношения 1 .. * и 1..1 в приложении сценария магазина (Классы: Элемент, Заказ, Линия заказа, Продукт, Программа, Пользователь) Как мне поступить с 1 пользователем, имеющим только 1 Заказу которого может быть много строк заказов (желательно с использованием структуры списка?

Это мой класс пользователя:

namespace ConsoleApplication1
{
    public class User
    {

        private string ffName;
        private string llName;
        private int id = 0;

        //Constructor
        public User(string firstName, string lastName)
        {
            fName = firstName;
            lName = lastName;
        }
        public User() {}

        //Overrides
        public override bool Equals(object obj)
        {
            return obj.ToString() == this.ToString();
        }
        public override int GetHashCode()
        {
            return this.ToString().GetHashCode();
        }
        public override string ToString()
        {
            string myUser;
            myUser = string.Format("First Name: {0}; Last Name: {1}", fName, lName);
            return myUser;     
        }

        // Properties
        public string fName
        {
            get
            {
                return ffName;
            }
            set
            {
                ffName = value;
            }
        }
        public string lName
        {
            get
            {
                return llName;
            }
            set
            {
                llName = value;
            }
        } 
    }
}

Ответы [ 4 ]

1 голос
/ 07 октября 2011

Вы можете иметь класс Order и класс OrderLine. Класс Order будет иметь список OrderLines, а класс User может иметь член Order.

Что-то вроде:

public class User
    {

        private string ffName;
        private string llName;
        private int id = 0;
        private Order order = null;

        //Constructor
        public User(string firstName, string lastName)
        {
            fName = firstName;
            lName = lastName;
        }
...
}

public class Order
{
 List<OrderLine> orderLines = null;
}

public class OrderLine
{
}
1 голос
/ 07 октября 2011

Вы должны реализовать класс Order и OrderLine как:

class OrderLine
{
      //some code
}


class Order
{
     List<OrderLine> lstOrderLine;

     //some code
}

Затем добавьте класс Order в свой класс пользователя.

0 голосов
/ 11 октября 2011

Ваш последний комментарий прояснил ваш вопрос:

Создать каждый не сложно, я просто не понимаю, как заставить отношения работать с 1 .. * или 1..1.Если я создаю Заказ, я всегда могу создать другой заказ

Итак, давайте поговорим о типах отношений.

Типы отношений

Типы отношений не говорят об абсолютном количестве объектов в системе.Они просто говорят о количестве сущностей в отношении к другим сущностям.

1: 1 Отношение

Это означает, что должны существовать два типа сущностейв парах.Если существует один объект типа A, то может существовать только один объект типа B.Например, ваши User и Order.Ордер не может существовать без User, а у User может быть только один Order.Это не значит, что есть только один User - , может быть 42 пользователя .Это просто означает, что если существует Order, User также должен существовать, и что User может иметь только один Order.

Существует строгая и менее строгая версия этого.Технически, я только что описал что-то вроде отношения 1: {0 или 1}.В реальных отношениях 1: 1 вы бы потребовали , чтобы существовал Order, если существует User.Ни один из них не может существовать, если другой не существует.Однако это ограничение обычно смягчается, когда речь идет о реляционных базах данных (но только в одном направлении - в этом случае у вас все еще не может быть Order без User).

Вы можете смоделировать это отношение с помощьюкод такой:

public class User
{
    public Order Order { get; set; }
}

public class Order
{
    // You could put a reference here back to the User if you want...
}

Обратите внимание, что немного странно поддерживать только один Order для User.Имеет смысл сделать это 1:*.Но если это требование вашего задания, то вы должны его смоделировать.

1: * Отношения

Это похоже на 1: 1отношения.Но это ослабляет некоторые ограничения, так что если сущность типа A существует, то может существовать любое число (включая ноль) типа B.Примером являются Order и OrderLine.Опять же, нет никаких ограничений на количество сущностей любого типа. В системе может быть 57 заказов .Вы просто не можете иметь OrderLine без Order, и может быть несколько OrderLine с на Order.

. Вы можете смоделировать это отношение с помощью кода, подобного следующему:

public class Order
{
    public List<OrderLine> OrderLines { get; set; }
}

public class OrderLine
{
    // You could put a reference here back to the Order if you want...
}

Включение реляционных понятий в код

Я не могу говорить о вашем назначении, поэтому убедитесь, что вы подтверждаете то, что я здесь говорю, в соответствии с требованиями вашего назначения.

Не пытайтесь применять базовые реляционные понятия, подобные этим, в коде.База данных лучше справляется с этим, имеет лучший (декларативный) язык для описания взаимосвязей и станет вашим основным источником данных для системы.

Вместо этого вам просто нужно создать мягкую модель, которая следует заотношения (как это делают примеры кода выше), и пусть база данных выполняет реальную политику этих ограничений.

Примеры:

  • Вы не должны пытаться ограничивать построение Orderвводит код в код, и вам не нужно требовать User для создания Order (как сущности кода).
  • Для создания OrderLine вам не нужно требовать Order для существования(как сущности кода).

Попытка ввести такие ограничения в коде ничего не дает.Когда вы сохраняете сущности в базе данных, база данных обеспечит эти отношения для вас (при условии, что вы настроили ее правильно, что вы научитесь делать).Ваша ошибка будет обнаружена, и вы выучите привычки, которые очень быстро избегают ошибок такого типа.

Попытка ввести такие ограничения в коде вредит вам.Написание вашей программы будет сложнее, а написание кода для вашего кода будет сложнее.

Например, рассмотрим алгоритм или тест, который сравнивает значения OrderLine.Может быть, вы хотите сравнить его с гипотетическим OrderLine.Если бы в вашем коде были реляционные ограничения, вам также пришлось бы создать гипотетические Order и User.Не могли бы вы также сравнить гипотетические User и Order с реальными?Что если вашему алгоритму не важно, из каких User или Order он возник?Если вы не собираетесь сравнивать их, зачем создавать их для начала?

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

0 голосов
/ 07 октября 2011

Редактировать: Убраны неряшливость и отношение:)

Сначала вам нужен заказ (подсказка, что для этого вам понадобится класс). Теперь заказ должен быть привязан к пользователю. Поэтому добавьте поле типа Пользователь. Это заботится об одном заказе одного пользователя. (Обратите внимание, что пользователь может сделать более одного заказа)

Так что теперь вы заказываете недостающие строки. Добавьте другую переменную-член, которая является списком типов линий. Теперь в вашем заказе вам нужно добавить методы для добавления, удаления и запроса строк заказа.

Редактировать: Был поднят вопрос, что означало «добавить поле». Добавить поле означает добавить свойство или приватный член. Когда вы делаете это, вы делаете технический термин композиции. Композиция обычно объясняется как «имеет» отношения. Таким образом, заказ «имеет пользователя» и «имеет список строк заказа»

Class User()
{
    public string firstName { get; set; }
    public string lastName {get; set; }
    public int id { get; set;}
}

Class OrderLine()
{

}

Class Order()
{
    private List<OrderLine> orderLines;
    public User submitter { get; set;}

    public Order()
    {
         orderLines = new List<OrderLine>();
    }

    public void AddOrderLine(OrderLine newOrderLine)
    {
         this.orderLines.Add(newOrderLine);
    }

    public IList<OrderLine> GetOrderLines()
    { 
         return this.orderLines;
    }
}

Пример

User customer1 = new User();
// Initialize customer1 values...
Order someOrder = new Order();
someOrder.submitter = customer1;
someOrder.AddOrderLine(new OrderLine());

РЕДАКТИРОВАТЬ: Изменен класс члена на класс пользователя

...