none
Нужна помощь RRS feed

Ответы

  • "а ведь можно просто хранить OrderId типа Int, и какой же вариант надо использовать. Просто этот Объект Order в таблицу вряд ли запишется. а если запишется то его нельзя просмотреть, ну и она вообще не запишется кажется, просто станет ключом?" - вы проектируете сущностные классы используя ООП, а мыслите как пректировщик реляционной БД. Как раз наоборот, можете не писать Int, а оставить только поле Order. Если связи нет, то объет будет содержать Null. В случае опциональных связей, используй Nullable<int>. А что касается записи объекта в БД, то это не проблема уровня сущностных классов, а уровня ORM.

    "но если так(хранить) то у некоторых Order могут не быть DeliveryId, а у некоторых могут быть. То есть этот DeliveryId типа Int всегда будет инкрементироваться просто так (да и вообще это чушь какая то)" - Nullable<T>.


    Сделаем содержимое сообщества лучше, вместе!

    • Предложено в качестве ответа YatajgaModerator 8 января 2014 г. 16:55
    • Помечено в качестве ответа Medet Tleukabiluly 9 января 2014 г. 1:05
    4 января 2014 г. 15:38
    Модератор

Все ответы

  • эта библиотека для работы с базой данных FoodStore. 

    У меня есть идея реализации. но иногда сомнения тоже появляются. ибо некие вещи трудно уловить.

    например есть такая трудность:>

    // таблица Deliveries содержит поле Order, это объект типа Orders (тут имееться ввиду Связь 1:1), а ведь можно просто хранить OrderId типа Int, и какой же вариант надо использовать. Просто этот Объект Order в таблицу вряд ли запишется. а если запишется то его нельзя просмотреть, ну и она вообще не запишется кажется, просто станет ключом?

    public class Delivery
        {
            public int DeliveryId { get; set; }
            public virtual Order Order { get; set; }
            public bool Awaiting { get; set; }
            public virtual Worker WorkerDelivery { get; set; }
            public int DeliveryMoneyPool { get; set; }
            public DateTime LastModified { get; set; }
            public bool Complete { get; set; }
            public bool Canceled { get; set; }
            public bool PackageOrder { get; set; }
            public Delivery()
            {
                Order = new Order();
                WorkerDelivery = new Worker();
    
    
            }
        }

    // но в таблице Orders нет поля Delivery, то есть свзязь односторонняя получается? Ок Ладно. И опять, может надо использовать OrderId в таблице Deliveries,  и тогда в таблице Orders можно будет хранить DeliveryId (а можно и не хранить. . .), но если так(хранить) то у некоторых Order могут не быть DeliveryId, а у некоторых могут быть. То есть этот DeliveryId типа Int всегда будет инкрементироваться просто так (да и вообще это чушь какая то)

    public class Order //заказ
        {
            public int OrderId { get; set; }
            public virtual Customer Customer { get; set; }
            public virtual List<Product> Products { get; set; }
            public DateTime DateOfOrder { get; set; }
            public virtual Worker Cashier { get; set; }
            public virtual OrderStatus OrderStatus { get; set; }
            public virtual Payment Payment { get; set; }
            public DateTime LastModified { get; set; }
            public Order()
            {
                Products = new List<Product>();
                Customer = new Customer();
                Cashier = new Worker();
                OrderStatus = new OrderStatus();
                Payment = new Payment();
                LastModified = DateTime.Now;
            }
    вообщем вопрос таков.  в таблице Deliveries надо хранить (Order)Order или (int)OrderId

    P.S. Голова болит уже от этого всего. 19 раз переделывал потому что впервые такое делаю




    4 января 2014 г. 13:42
  • "а ведь можно просто хранить OrderId типа Int, и какой же вариант надо использовать. Просто этот Объект Order в таблицу вряд ли запишется. а если запишется то его нельзя просмотреть, ну и она вообще не запишется кажется, просто станет ключом?" - вы проектируете сущностные классы используя ООП, а мыслите как пректировщик реляционной БД. Как раз наоборот, можете не писать Int, а оставить только поле Order. Если связи нет, то объет будет содержать Null. В случае опциональных связей, используй Nullable<int>. А что касается записи объекта в БД, то это не проблема уровня сущностных классов, а уровня ORM.

    "но если так(хранить) то у некоторых Order могут не быть DeliveryId, а у некоторых могут быть. То есть этот DeliveryId типа Int всегда будет инкрементироваться просто так (да и вообще это чушь какая то)" - Nullable<T>.


    Сделаем содержимое сообщества лучше, вместе!

    • Предложено в качестве ответа YatajgaModerator 8 января 2014 г. 16:55
    • Помечено в качестве ответа Medet Tleukabiluly 9 января 2014 г. 1:05
    4 января 2014 г. 15:38
    Модератор
  • // таблица Deliveries содержит поле Order, это объект типа Orders (тут имееться ввиду Связь 1:1), а ведь можно просто хранить OrderId типа Int, и какой же вариант надо использовать.

    Для начала, как мне кажется, вам следует начать с освоения теории реляционных баз данных, с освоения основ языка SQL, потому что явное непонимание всего этого.

    В таблицах БД при указании связей между ними не хранятся объекты. Хранятся лишь первичные и внешние ключи, с помощью которых и реализованы связи.


    Просто этот Объект Order в таблицу вряд ли запишется. а если запишется то его нельзя просмотреть, ну и она вообще не запишется кажется, просто станет ключом?

    ORM, такие как EF, сами отслеживают связи, и считывают записывают дочерние-родительские объекты. При этом, повторюсь, в самих таблицах БД нет полей типа Order или Delivery, а есть родительские и внешние ключи. EF на основе этих ключей создаёт свойства в коде, по которым можно прозрачно получать доступ к связанным объектам.

    Многое зависит от выбранного подхода: Code First или Database First.


    // но в таблице Orders нет поля Delivery, то есть свзязь односторонняя получается?

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

    Отмечу, что эта серия статей специфична, и не даёт основ работы с БД, а рассчитана именно на освоение проблемно-ориентированного проектирования.


    И опять, может надо использовать OrderId в таблице Deliveries,  и тогда в таблице Orders можно будет хранить DeliveryId (а можно и не хранить. . .), но если так(хранить) то у некоторых Order могут не быть DeliveryId, а у некоторых могут быть.

    Ну да, это нормально. При проектировании БД можно разрешить не иметь связей.

    То есть этот DeliveryId типа Int всегда будет инкрементироваться просто так (да и вообще это чушь какая то)

    С чего это он будет инкрементироваться просто так? Если это тип identity, то при каждой новой вставке будет новое значение поля, но созданные ранее не изменятся.

    вообщем вопрос таков.  в таблице Deliveries надо хранить (Order)Order или (int)OrderId

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

    • Предложено в качестве ответа YatajgaModerator 8 января 2014 г. 16:55
    4 января 2014 г. 16:05
  • я использовал code first, и в youtube поискал, нашел кое что где делается совсем обратное. если судить по видео, то мне следует использовать оба типа (Order) Order и (int) OrderId.

    4 января 2014 г. 16:56
  • Это обычные соглашения для Code First. Т.е. EF наличие двух свойств нужно для генерации отношейний между таблицами в БД (внешних ключей). Это наиболее простой вариант. Можно не использовать поле с типом int, а неоходимую информацию передать в БД с помощью Fluent API при инициализации. Но в вашем случае, для простоты лучше оставить всё как есть.

    Сделаем содержимое сообщества лучше, вместе!

    4 января 2014 г. 17:31
    Модератор
  • если честно досихпор парюсь какой мне нужен вариант, простой (и потом если вдруг делать дальше, то никчему хорошему не приведет), или же правильный (которые довольно сложно сделать)
    5 января 2014 г. 17:50
  • на что нужно обращать внимание при осуществлении платежей(покупка товара) в приложении. 
    6 января 2014 г. 9:41
  • "я не знаю t-sql, и предпочтительней метод code first, полагаю dbForge Studio ничем не поможет" - универсального рецепта вам тут никто не даст. Каждое приложение уникально по своему. В целом надо учитывть такие критерии как безопасность и надёжность (отказоустойчивость). Если речь идёт о работе с платёжными системами.

    Сделаем содержимое сообщества лучше, вместе!

    7 января 2014 г. 18:26
    Модератор