LINQ에서 SQL 엔티티 및 데이터 컨텍스트 클래스 : 비즈니스 객체 캡슐화
-
03-07-2019 - |
문제
LINQ에서 SQL Entity 클래스와 데이터 컨텍스트 클래스를 비즈니스 개체로 캡슐화하는 가장 좋아하는 방법은 무엇입니까?
주어진 상황에서 무엇을 일하는 것을 발견 했습니까?
특정 패턴을 발명했거나 가져 왔습니까?
해결책
적어도 내 경우에는 가장 잘 작동한다고 생각하는 패턴을 찾았습니다.
부분 클래스를 사용하여 엔티티 클래스를 확장합니다. 나는 부분 클래스를 사용하여 엔티티의 서명이 변경되지 않습니다 ( DeleteOnSubmit
전화로 전화하십시오 Delete
방법).
나는 작은 예를 들었다. 다음은 데이터베이스 및 LINQ에서 SQL 클래스 설정 이미지입니다.
그리고 여기 내가 비즈니스 로직을 구현하는 부분 클래스가 있습니다.
/// <summary>
/// This class extends BusinessLogicDataContext.Products entity class
/// </summary>
public partial class Product
{
/// <summary>
/// New up a product by column: dbo.Products.ProductId in database
/// </summary>
public Product(Int32 id)
{
var dc = new BusinessLogicDataContext();
// query database for the product
var query = (
from p in dc.Products
where p.ProductId == id
select p
).FirstOrDefault();
// if database-entry does not exist in database, exit
if (query == null) return;
/* if product exists, populate self (this._ProductId and
this._ProductName are both auto-generated private
variables of the entity class which corresponds to the
auto-generated public properties: ProductId and ProductName) */
this._ProductId = query.ProductId;
this._ProductName = query.ProductName;
}
/// <summary>
/// Delete product
/// </summary>
public void Delete()
{
// if self is not poulated, exit
if (this._ProductId == 0) return;
var dc = new BusinessLogicDataContext();
// delete entry in database
dc.Products.DeleteOnSubmit(this);
dc.SubmitChanges();
// reset self (you could implement IDisposable here)
this._ProductId = 0;
this._ProductName = "";
}
}
구현 된 비즈니스 로직 사용 :
// new up a product
var p = new Product(1); // p.ProductId: 1, p.ProductName: "A car"
// delete the product
p.Delete(); // p.ProductId: 0, p.ProductName: ""
또한 LINQ에서 SQL Entity 클래스는 본질적으로 매우 개방적입니다. 이것은 속성에 해당하는 것을 의미합니다 dbo.products.productid 열은 getter와 setter를 모두 구현합니다.이 필드는 변할 수 없어야합니다.
내 아는 한 부분 클래스를 사용하여 속성을 무시할 수 없으므로 일반적으로하는 일은 인터페이스를 사용하여 객체를 좁히는 관리자를 구현하는 것입니다.
public interface IProduct
{
Int32 ProductId { get; }
void Delete();
}
다른 팁
저장소 패턴을 사용하여 Datacontexts를 캡슐화하는 경향이 있습니다.
LINQ2SQL을 사용하는 동안 데이터 계층에서 POCO 객체를 방출하는 더 나은 방법을 찾고 싶습니다.
방금 IOC 및 T4-Templates를 사용하여 Storage에 LINQ에서 SQL을 사용하는 응용 프로그램을 구조화하는 방법에 대한 샘플을 게시했습니다.
http://daniel.wertheim.se/2010/03/14/linq-to-sql-how-to-separate-the-entities-be-the-datacontext/
지금은 LINQ에서 SQL Entity 클래스를 비즈니스 객체로 사용하여 기능과 서비스간에 전달하려고합니다.
물론, 당신은 있어야합니다 데이터베이스 액세스를위한 별도의 엔티티 클래스, 따라서 비즈니스 개체를 변경하지 않고 데이터베이스 레이아웃이 변경 될 수 있습니다!
나는 이것에 대한 좋은 솔루션에도 가장 관심이 있습니다!
Rob Conery가 함께 모이는 MVC 샘플 앱의 소스 코드를 확인하십시오.
http://www.codeplex.com/mvcsamples/
그는 LINQ에서 SQL 클래스에 맵핑하는 별도의 엔티티 레이어를 가지고 있습니다.
Entity Framework와 LINQ를 사용하여 엔티티를 사용하여 클라이언트 코드를 데이터베이스에서 더 분리하는 방법으로 실험을했지만 사용이 서투른 것으로 나타 났으며 성능에 대해 걱정했습니다.
현재 프로젝트에서는 LINQ에서 SQL을 데이터 계층으로 사용하지만 모든 LINQ 쿼리를 구현하는 별도의 클래스가 있습니다. 클래스는 LINQ에서 SQL 컨텍스트에 정의 된 엔티티를 반환하지만 쿼리는 메소드에 숨겨져 있습니다.
나는 기사를 찾았다 Codebetter.com의 Ian Cooper 그리고 스티븐 월더 시리즈는 먼저 Poco 엔티티를 작성해야 할 필요성을 이해하는 데 귀중한 다음 다른 방식으로 수행하지 않고 데이터베이스에 매핑해야합니다 (이것은 항상 사용했던 것입니다).
나는 별도의 OO 모델 레이어 (OO 관행에 대한 더 나은 지원)를 갖는 아이디어를 가지고 있지만, 후드 아래에서 LINQ에서 SQL을 사용합니다. 아이디어는 사용자 정의 도구가 코드를 생성하는 데 사용할 XML 파일을 갖는 것입니다. LINQ에서 SQL Entites가 선호하는 데 너무 어수선하므로 내 엔티티로 사용할 새로운 클래스를 자동 생성 할 것이며 물론 DataContext는 클라이언트 코드에 완전히 숨겨집니다. 짧은 대답은 다음과 같습니다. 새 엔티티 클래스를 만들지 만 기본 LINQ에서 SQL 엔티티 및 데이터 컨텍스트를 사용하십시오.