2

現在、学位プロジェクトの設計に取り組んでいます。数日前、LINQ の勉強を始めました。興味深く、プロジェクトで使用する予定でしたが、ある時点で混乱しています。

LINQ to SQL クラスを追加すると、データベース内の各テーブルに対してエンティティ クラスが自動生成されます。

データベースに 2 つのテーブルがあるとします。

ユーザー
プロジェクト
UserProjects (結合テーブル)

どのユーザーがどのプロジェクトに関連付けられているかを表すジョイント テーブル。

LINQ to SQL クラスは、これら 3 つのクラスを自動生成します。ここで、別の (ユーザーとプロジェクト) クラスをビジネス オブジェクトとして作成するか、これらの自動生成されたエンティティを使用しますか?

また、データベース機能を使用するには、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();
    }

}

上記のメソッド呼び出しシーケンスは問題ありませんか?

4

2 に答える 2

5

Linq To SQL は、単一層の設計に最適です。切断されたモデル多層環境にはあまり適していません。

上記のコードは、単一のユーザーのみをデータベースに挿入します。MSSQL SQL Server Profiler を起動するか、ログを 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
}

作業単位を実行するたびに、データベース契約を使用していることを確認する必要があります。(データベース コンテキストはデフォルトでトランザクションを使用しており、これは見苦しくなる可能性があるため、データベース コンテキストの構築でパフォーマンスを気にしないでください! )

通常、多層環境で作業する場合、ワイヤ(ネットワーク)を介して渡すときに個別のPOCOを作成します。

NCommonは、Linq to Sql の優れた抽象化であり、ビジネスの検証とルールを処理する必要があります。

ノート。データベース内のパスワード値をハッシュすることをお勧めします。

linq に関する簡単な Q&A と基本については、ScottGu のブログをご覧ください。

于 2009-05-28T05:51:06.380 に答える
0

私は通常、BLLオブジェクトごとにクラススコープのデータコンテキストを作成します。

また、2つのコンストラクターを作成します。1つはデータコンテキストを作成し、もう1つはデータコンテキストを受け入れます。2つ目は、他の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();
    }
}
于 2009-05-28T05:46:32.880 に答える