2

MVC パターンのモデル設計に問題があり、C# の静的型にこだわっています。

私がやりたいことは、すべてのデータベースの挿入、更新、削除操作を行うクラスのグループを作成することです。このグループは、データベース内の各テーブルからマップされるクラスのサブグループと、テーブル クラスにアクセスするテーブル モデル クラスのサブグループで構成されます。

LINQ マッピングを使用してテーブル クラスを作成しています。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using System.Data.Linq.Mapping;
using Iris.Libraries;

namespace Iris.Models.Tables
{
    [Table]
    public class Users
    {
        [Column(IsPrimaryKey = true)]
        public string User_Id;

        [Column]
        public string Name;

        [Column]
        public string Password;

        [Column]
        public int Userlevel_Id;

        public Users()
        {
        }
    }
}

次に、モデル クラスによってアクセスされるテーブル:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using System.Data.Linq;
using Iris.Models.Tables;
using Iris.Models.DataContexts;

namespace Iris.Models
{
    public class UserModel
    {
        private UserDataContext dataContext;
        private Table<Users> users;

        public UserModel()
        {
            this.dataContext = new UserDataContext(Config.CONNECTION_STRING);

            this.users = this.dataContext.GetTable<Users>();
        }

        public List<Users> Select()
        {
            var data = from user in this.users select user;

            return data.ToList<Users>();
        }

        public Users Select(object id)
        {
            var data = from user in this.users where user.User_Id.ToString() == id.ToString() select user;

            return data.ToList<Users>()[0];
        }

        public void Insert (Users user)
        {
            this.dataContext.Users.InsertOnSubmit(user);

            this.dataContext.SubmitChanges();
        }

        public void Update(Users user)
        {
            var queryableData = from row in this.dataContext.Users where row.User_Id == user.User_Id select row;

            var editedData = queryableData.Single<Users>();

            editedData.User_Id = user.User_Id;
            editedData.Name = user.Name;
            editedData.Password = user.Password;
            editedData.Userlevel_Id = user.Userlevel_Id;

            this.dataContext.SubmitChanges();
        }

        public void Delete(Users user)
        {
            var queryableData = from row in this.dataContext.Users where row.User_Id == user.User_Id select row;

            var deletedData = queryableData.Single<Users>();

            this.dataContext.Users.DeleteOnSubmit(deletedData);

            this.dataContext.SubmitChanges();
        }
    }
}

上記のコードのペアは問題なく正常に動作しますが、データベースには多くのテーブルがあるため、モデル クラスの「ほぼ同じ」コードを何度も書くことは避けたいと考えています。その目的を達成するために、モデルの一般化されたクラスと、そこから拡張されたすべてのテーブルモデルを作成しようとしています。

public class Users : Model {}

問題は

private Table<Users> users;

テーブルごとに常に異なる Table<> のクラスはどれですか。私は何日も探し回っていましたが、この問題を解決する答えが見つかりませんでした。

上記の私のようなテーブルモデルを一般化することは本当に不可能ですか? または、同じコードを繰り返し記述しないようにする他の方法はありますか? 誰でも、私を助けてください.. :(

4

2 に答える 2

0

次の一般的な方法を使用します。

System.Data.Linq.Table<T> GetTable
{
        get { return _db.GetTable<T>(); }
}

Repository Patternを使用できます。最初に汎用インターフェイスを作成します。

public interface IRepository<T> where T : class
{
    void Add(T entity);
    void Delete(T entity);
    void Update(T entity);
    IEnumerable<T> GetAll(Func<T,bool> exp);
    ....
}

次に、汎用リポジトリ モデルは次のようになります。

public class Repository<T> : IRepository<T>
    where T : class, IEntity
{
    DataContext _db;
    public Repository()
    {
        _db = new DataContext("Database Connectionstring");
        _db.DeferredLoadingEnabled = false;
    }
    System.Data.Linq.Table<T> GetTable
    {
        get { return _db.GetTable<T>(); }
    }
    public IEnumerable<T> GetAll(Func<T, bool> exp)
    {
        return GetTable.Where<T>(exp);
    }
    ...
    .
}
于 2012-04-16T12:05:49.270 に答える
0

このような状況は、当社で一度発生しました。

モデルを一般化しようとせずに、各テーブルに非常によく似たコードを記述するという「最悪の」アプローチを選択しました (基本的に、回避したいアプローチを採用しました)。

このアプローチは見た目も臭いも非常に悪かったのですが、メソッドとプロパティが大きく区画化されているため、これまでと同じようにデバッグが簡単であることがわかりました。また、展開も非常に高速です。必要なのは、コピーして貼り付け、違いを微調整することだけです。

編集: この選択の背後にある主な理由は、「これは私たちが独自に設計したデータベースであり、近い将来にそれほど変更されることはありません」

于 2012-04-16T12:16:21.923 に答える