推广LINQ模型

时间:2012-04-16 11:59:34

标签: c# linq linq-to-sql

我在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&lt;&gt;中的哪个类每张桌子总是不同的。我一直在寻找几天,但没有找到任何答案来解决这个问题。

是否真的不可能像上面那样概括表格模型?或者还有其他方法可以避免重复编写相同的代码吗?任何人,请帮助我.. :(

2 个答案:

答案 0 :(得分: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);
    }
    ...
    .
}

答案 1 :(得分:0)

这种情况曾在我们公司发生过一次。

我们选择了“最差”的方法为每个表编写非常相似的代码,而不是试图概括模型(基本上,我们采用了你想要避免的方法)。

这种方法看上去并且闻起来非常糟糕,但由于方法和属性的分区很大,所以它一如既往地无法调试。它的扩展速度也非常快,您需要做的就是复制,粘贴和调整差异。

编辑:这个选择背后的主要原因是“这是我们自己设计的数据库,在可预见的未来,它不会发生太大变化”