未来证明DAL

时间:2011-01-18 22:05:39

标签: c# tsql entity-framework subsonic3 data-access-layer

我们正处于一个包含多个子项目的长期开发项目的开端。基本上每个子项目都需要几个月的时间来开发。代码本身将分成几个C#项目,但物理数据库将由所有项目共享。

问题在于可维护性。如果我们向表中添加一个列,或者将一个表拆分成两个较小的表,我们将不得不返回并修改我们的C#DAL以支持这些更改。这是不可接受的,因为我们将不断调整数据库以满足整个公司的需求,而不仅仅是单个程序的需求。不断改变旧代码将是一项无休止的任务。

我们的数据库人员提出了不同的看法。我们通过存储过程完成所有CRUD,并在几个表中使用Linq来执行SELECT语句。然后,如果我们从现在起几年后重构数据库,我们可以简单地提供相同的存储过程和视图,而不必修改我们的旧代码。

我们遇到的问题是ORM应该用于这样的事情吗? EF似乎有点矫枉过正(可能不是)。像SubSonic这样的T4模板是否适合简化(也许更快)DAL?

或者有人知道如何让整个过程不那么痛苦?我们宁愿不在我们的应用程序中添加另一层,但我们也不想每次进行db更改时返回并修改代码。

编辑1: 所以当我说“我真的不想添加更多图层”时。这主要是因为我们已经有几层。我们有Silverlight视图,视图模型,BLL对象(通过CSLA),然后我们有DAL,最后是SQL表格。

3 个答案:

答案 0 :(得分:6)

C# DAL... not just the needs of a single program。 C#DAL作为一个单独的程序集的重点在于它可以在任何类型的.NET应用程序中重用。您将遇到的主要问题是,如果数据库发生更改,则DAL必须更改(一次),然后必须使用新DAL重新部署所有依赖于DAL的应用程序。您还遇到非.NET应用程序无法使用DAL的问题。

好的,那么如何集中DAL以便您不必为每个应用程序重新部署它?想想SOA。您可以构建一个WCF服务来包含DAL(可能还有BLL)。您的所有应用程序(如果使用Web服务,甚至是非.NET的应用程序)都可以使用此服务。数据库更改时,您将更新WCF服务并部署一次。只要确保你没有做任何重大改变!如果需要添加/更改功能,请创建MyMethod2。

  

注意:当您听到n层时,通常会   指每层的三层   是单独的软件,通常是   单独的服务器:演示文稿(UI),   应用程序(您的BLL / DAL),数据(您的   SQL数据库)。这种架构有其优点。

We'd rather not add another layer to our application。好的,所以三层可能不是你的最佳方法。

neither do we want to go back and modify code everytime we make a db change那么你的DBA人建议的是唯一的方法。

但是,请考虑一下:更改存储过程与修改代码一样吗?它基本上是一回事。 SQL存储过程通常不受版本控制或测试,但它们应该是。 SQL没有像.NET这样的语言的丰富性。 WCF可以在Web场中轻松扩展。一旦考虑了这些和其他原因,就可能值得采用三层/ SOA方法。

这实际上取决于项目的规模,员工的技能,未来的发展等等,这是您可以确定的。

答案 1 :(得分:1)

我已根据BLToolkit

的效果信息开始使用http://ormeter.net/

您可以在简单的类文件中定义模型,添加一些应用了属性的方法,并预先设置DAL。将表拆分为两个,您可以在创建新的类文件时维护原始类文件以支持拆分表。只需确保创建一个测试项目,该项目可以确保每个方法都适用于每个方法

    public class DirectoryListing
    {
        [PrimaryKey, Identity]
        public Int64 Id { get; set; }
        public Int64? OldId { get; set; }
        public Int32 CategoryId { get; set; }
        [Nullable]
        public String CompanyName { get; set; }
}

常规选择或表值函数:

[SqlQuery("SELECT * FROM Ajax_CategorySearch(@SearchString, @ResultCount)")]
[Cache(MaxCacheTime = 10, IsWeak = false)]
public abstract List<String> AjaxCategorySearch(String @SearchString, Int32 @ResultCount = 10);

或者使用存储过程:

[ActionName("SelectById")]
public abstract Model.DirectoryListing SelectById(Int64 @Id);

这将调用SP DirectoryListing_SelectById

哦,以更经典的方式做事也很容易

    using (BIFDbManager db = new BIFDbManager())
    {
        var output = db.SetCommand(
            "SQL GOES HERE",
            db.Parameter("@Id", 1))
            .ExecuteList<DAL.Model.DirectoryListing>();

        totalrecords = output.Count();

        return output;
    }

最后一个难题是数据库管理器,它还支持LINQ。

public class BIFDbManager : DbManager
{
    public BIFDbManager() : base("Connection string name") { }

    public Table<DirectoryListing> DirectoryListings { get { return GetTable<DirectoryListing>(); } }
}

答案 2 :(得分:0)

没有数据库,您可以工作多长时间?如果是问题,请及时介绍。是的,这可能意味着您添加了一个图层。

相关问题