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