• Microsoft .NET
  • LINQ
  • LINQtoSQL: Модификация в соответствии с требованиями код, генерируемый конструктором

LINQ to SQL - отделение сущностей при помощи Detach - Использование функции Detach

ОГЛАВЛЕНИЕ

Использование функции Detach

Одним из способов применения отделения и соединения сущностей Linq to SQL является использование модели хранилища. Мы установили простой OrderRepository для получения и сохранения заказов (Orders).

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Detach.Repositories
{
    public class OrderRepository
    {
        public static Order Get(int orderId)
        {
            Order order = null;
            using (var context = new PetshopDataContext())
            {
                order = context.Orders.FirstOrDefault(o => o.OrderId == orderId);
                order.Detach();
            }
            return order;
        }
        
        public static Order Save(Order order)
        {
            using (var context = new PetshopDataContext())
            {
                if (order.OrderId > 0)
                    context.Orders.Attach(order, true);
                else
                    context.Orders.InsertOnSubmit(order);
                   
                context.SubmitChanges();
                order.Detach();
            }
            return order;
        }
    }
}

Как вы могли уже заметить, каждый из данных методов имеет свой контекст данных (datacontext). Нет необходимости в передаче одного datacontext по всем в качестве параметра либо содержать его в переменной модульного уровня. Сущности полностью отделены, что означает полную свободу использования их где вам захочется и вам не придется беспокоиться об datacontext. Возможность отделения позволяет создать модель репозитория при помощи LINQ to SQL. Указанный далее код взаимодействует с хранилищем и не заботится о datacontext или об поддержании соединения с базой данных.

Order order = new Order();
order.BillAddr1 = "0001 Cemetery Lane";
order.BillCity = "Westfield";
order.BillState = "NJ";
order.BillZip = "07090";
order.BillCountry = "US";
order.Courier = "DHL";
order.OrderDate = System.DateTime.Now;
order.TotalPrice = 0;
order.AuthorizationNumber = 1;
order.BillToFirstName = "Gomez";
order.BillToLastName = "Adams";
order.Locale = "blah";
order.ShipToFirstName = "Gomez";
order.ShipToLastName = "Adams";
order.ShipAddr1 = "0001 Cemetery Lane";
order.ShipCity = "Westfield";
order.ShipState = "NJ";
order.ShipZip = "07090";
order.ShipCountry = "NJ";
order.UserId = "gadams";
    
order = OrderRepository.Save(order);
    
order.UserId = "gadams2";
order = OrderRepository.Save(order);
    
order = OrderRepository.Get(2);
order.TotalPrice = 150;
order = OrderRepository.Save(order);

Вывод

Как вы можете убедиться, за отделением сущности от datacontext стоят некоторые усилия. Также диаграмма объектов становится немного сложнее, и не так легко обеспечить полное отделение сущности. Разделение в PLINQO обладает всеми мерами предосторожности при отделении от datacontext и обеспечивает возможность использования сущности в отсоединенной манере. Возможность использовать сущности LINQ to SQL , отделенных от datacontext, открывает множество возможностей для инкапсуляции и повторного использования.

PLINQO генерирует методы отделения для каждой сущности, которые похожи на тот, который только что создали для сущности Product. PLINQO находит все дочерние сущности, списки и свойства, которые также должны быть отделены и обеспечивает выполнение соответствующих отделяющих методов для этих сущностей тогда, когда отделяется сущность от datacontext. Это означает, что вы не должны волноваться о том, что необходимо для отделения сущностей. PLINQO уже позаботился об этом.

Итак, как же отделить сущности используя PLINQO? Вызовите метод Detach и все!

Eric J. Smith, Shannon Davidson

Загрузить исходный код - 220.6 KB