我们正处于一个包含多个子项目的长期开发项目的开端。基本上每个子项目都需要几个月的时间来开发。代码本身将分成几个C#项目,但物理数据库将由所有项目共享。
问题在于可维护性。如果我们向表中添加一个列,或者将一个表拆分成两个较小的表,我们将不得不返回并修改我们的C#DAL以支持这些更改。这是不可接受的,因为我们将不断调整数据库以满足整个公司的需求,而不仅仅是单个程序的需求。不断改变旧代码将是一项无休止的任务。
我们的数据库人员提出了不同的看法。我们通过存储过程完成所有CRUD,并在几个表中使用Linq来执行SELECT语句。然后,如果我们从现在起几年后重构数据库,我们可以简单地提供相同的存储过程和视图,而不必修改我们的旧代码。
我们遇到的问题是ORM应该用于这样的事情吗? EF似乎有点矫枉过正(可能不是)。像SubSonic这样的T4模板是否适合简化(也许更快)DAL?
或者有人知道如何让整个过程不那么痛苦?我们宁愿不在我们的应用程序中添加另一层,但我们也不想每次进行db更改时返回并修改代码。
编辑1: 所以当我说“我真的不想添加更多图层”时。这主要是因为我们已经有几层。我们有Silverlight视图,视图模型,BLL对象(通过CSLA),然后我们有DAL,最后是SQL表格。
答案 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)
没有数据库,您可以工作多长时间?如果是问题,请及时介绍。是的,这可能意味着您添加了一个图层。