문제

현재 저는 학위 프로젝트의 디자인 작업을 하고 있습니다.며칠 전부터 저는 LINQ를 공부하기 시작했습니다.나는 그것이 흥미롭다는 것을 알았고 내 프로젝트에 그것을 사용할 계획이었지만 지금은 어느 시점에서 혼란스러워지고 있습니다.

LINQ to SQL 클래스를 추가하면 데이터베이스의 각 테이블에 대해 엔터티 클래스가 자동 생성됩니다.

데이터베이스에 두 개의 테이블이 있다고 가정합니다.

사용자
프로젝트
UserProjects(공동 테이블)

어떤 사용자가 어떤 프로젝트와 연관되어 있는지를 나타내는 공동 테이블.

LINQ to SQL 클래스는 자동으로 이 세 가지 클래스를 생성합니다.이제 별도의(사용자 및 프로젝트) 클래스를 비즈니스 개체로 만들거나 자동 생성된 엔터티를 사용해야 합니까?

또한 데이터베이스 기능을 사용하려면 3계층 아키텍처를 사용해야 합니다.내 BLL에서 LINQ DAL 메서드를 직접 호출할 수 있습니까? 아니면 LINQ DAL의 메서드를 호출하는 별도의 DAL을 만들어야 합니까?

class UserBLL

{
    public void saveUser(String username, String password)
    {
         // here I am calling LINQ DAL from by BLL
         UserDataContext db = new UserDataContext();
         User u =new User {Username = username, Password = password};
        db.user.InsertOnSubmit(u);
       db.SubmitChanges();
    }

}

위 메서드 호출 순서가 괜찮나요?

도움이 되었습니까?

해결책

Linq To SQL은 단일 계층 설계에 적합합니다.그다지 좋지는 않습니다. 연결이 끊긴 모델 또는 다중 계층 환경.

위의 코드는 데이터베이스에 단일 사용자만 삽입합니다.MSSQL SQL Server 프로파일러를 실행하거나 로그를 Visual Studio의 출력에 연결하는 경우.넌 봐야 해

//Hookup the log to the output in visual studio
using (var db = new UserDataContext()) {
    db.Log = Console.Out;
}

INSERT INTO User VALUES (value1, value2, value3,...)

사용자를 업데이트하려면 코드가 다음과 같아야 합니다.

public void UpdateUser(String username, String password, int userId)
{
     using (var db = new UserDataContext()) {
         //Get Row From Database Marching Id
         var user = db.user.Single(p => p.Id = userId);
         //Update Values
         user.Username = username;
         user.Password = password;
         //Save To The Database
         db.SubmitChanges();
     }
}

//Get All Users From Database
public IEnumerable<User> GetAllUsers()
{
     using (var db = new UserDataContext()) {
         //Get Row From Database Matching Id
         var users = from user in db.user
                    select user;
         return users.ToList();
     }
}

//To display the data just enumerate through the enumeration that is returned.
var users = BusinessInstance.GetAllUsers();
foreach (var user in users) {
    //user is the current item
}

작업 단위를 수행할 때마다 데이터베이스 계약을 사용하고 있음을 확인해야 합니다.(기본적으로 트랜잭션을 사용하는 데이터베이스 컨텍스트는 추악해질 수 있기 때문에 데이터베이스 컨텍스트를 구성할 때 성능에 대해 걱정하지 마세요!)

일반적으로 다중 계층 환경에서 작업할 때는 별도의 포코유선(네트워크)을 통해 전달할 때입니다.

NCommon Linq에서 Sql로의 훌륭한 추상화이며 비즈니스 유효성 검사 및 규칙을 처리해야 합니다.

메모.좋은 습관은 해시 비밀번호 값 데이터베이스에서.

확인해 보세요 Linq에 대한 빠른 Q&A 및 기본 사항을 제공하는 ScottGu의 블로그

다른 팁

저는 일반적으로 각 BLL 개체에 대해 클래스 범위의 datacontext를 만듭니다.

또한 2개의 생성자를 생성합니다. 하나는 datacontext를 생성하고 다른 하나는 datacontext를 허용합니다.두 번째는 다른 BLL 개체의 데이터 컨텍스트를 전달할 수 있다는 것입니다.

이를 통해 2개의 서로 다른 BLL 개체에서 나온 개체에 대해 데이터베이스 작업을 수행하는 동시에 우려 사항을 적절하게 분리할 수 있습니다.또한 데이터 컨텍스트를 전달할 수 있도록 공개 읽기 전용으로 노출해야 합니다.

주목해야 할 점은 DataContext 개체를 명시적으로 삭제할 필요가 없다는 것입니다. 자세한 내용은 여기.그러나 기본적으로 DataContext는 BLL 개체의 수명 동안만 유지됩니다.하지만 실제로 리소스를 확보해야 하는 경우(예:변경 사항 추적이 완료되었습니다.)

예를 들어

public class UserBLL
{
    private readonly UserDataContext context;

    public UserBLL() : this(new UserDataContext())
    {
    }

    public UserBLL(UserDataContext context)
    {
        this.context = context
    }

    public UserDataContext Context { get { return context; } }

    public void saveUser(String username, String password)
    {
         // here i am callsing LINQ DAL from by BLL
         User u = new User {Username = username, Password = password};
         Context.Users.InsertOnSubmit(u);
         Context.SubmitChanges();
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top