LINQ에서 SQL 엔티티 및 데이터 컨텍스트 클래스 : 비즈니스 객체 캡슐화

StackOverflow https://stackoverflow.com/questions/223931

  •  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 엔티티 및 데이터 컨텍스트를 사용하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top