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 回答