.net LINQ到SQL生成的对象可以解耦吗?

.net LINQ到SQL生成的对象可以解耦吗?,.net,linq-to-sql,architecture,.net,Linq To Sql,Architecture,我喜欢LINQ to SQL,但它生成的类似乎与存储它们的数据库紧密耦合,这似乎是一件坏事 例如,使用ye olde Northwind数据库,如果我使用Products表创建dbml,将生成一个Product类。我可以在任何其他层中使用这个类,这很好,但是如果我决定使用普通的旧ADO.NET(或switch数据库),我将不得不重新创建产品类,以及其他所有“模型” 有办法解决这个问题吗?或者单独创建对象模型,然后将表映射到它们?我已经研究了提供的各种映射类,但还没有找到令人满意的答案。Scott

我喜欢LINQ to SQL,但它生成的类似乎与存储它们的数据库紧密耦合,这似乎是一件坏事

例如,使用ye olde Northwind数据库,如果我使用Products表创建dbml,将生成一个
Product
类。我可以在任何其他层中使用这个类,这很好,但是如果我决定使用普通的旧ADO.NET(或switch数据库),我将不得不重新创建
产品
类,以及其他所有“模型”


有办法解决这个问题吗?或者单独创建对象模型,然后将表映射到它们?我已经研究了提供的各种映射类,但还没有找到令人满意的答案。

Scott Hanselman在屏幕上谈到了asp.net DynamicData,他在其中使用Linq To Sql类。虽然他没有提到具体问题,但我认为总体概念仍然有效。他的方法是创建一个单独的partial类,该类与dbml生成的类同名,在您的例子中是
Product
。然后,您应该始终拥有一个
产品
类,该类存在于LINQ生成的内容之外,并且只是“扩展”了它的功能。

我的团队最近就解决了这个问题。我真的想维护“持久性无知”,这意味着域对象可以作为普通的旧C#对象创建,而不必被迫从某个基类继承,也不必用一堆属性将类弄乱。正如您所说,我们希望能够独立于业务模型修改持久性层

最后,我们决定,如果你想要持久性,LINQ不是你要走的路。我们最终编写了太多的映射代码,无法在LINQ层和业务层之间进行转换。当我们开始编写一堆基于反射的代码来尝试自动执行这些映射时,我们意识到我们正在滑向兔子洞,几乎没有什么可展示的

如果持久性无知对您很重要,那么像NHIbernate这样成熟的ORM可能会更好地为您服务。

Linq to SQL(或EF)与持久性无知无关。它是关于数据的对象视图


NHibernate是您可能正在寻找的持久性ORM。

只需将生成的代码复制到您自己的类中,然后关闭代码生成。魔法在于属性,而不是其他任何东西


或者,您可以编写自己的没有属性的普通CLR对象,并使用外部XML映射文件来描述对象与数据库之间的关系。更多信息可以在MSDN上的LINQ to SQL文档中找到。

我最近通过自己创建POCO并手动为数据库创建XML映射文件实现了这一点。它需要一些手工工作,但能达到预期的效果


这里有一个让你开始的方法

所有这些答案都没有链接!也许我能帮上忙:

我有好几次经历过这种困难,我在上一个项目中所做的是使用接口作为契约,在解决方案中的所有不同项目之间共享,并让部分类实现它

[Table(Name="Products")]
public partial class Product: IProduct { }
是的,不幸的是,在POCO实现中需要一些反射魔法

最后,如果你真的关心它,我会选择NHibernate(我也不太喜欢),这正是Garry Shulter所描述的


希望有帮助

哦,嘿,我想我在看电影的时候找到了解决办法。诀窍是
选择
到LINQtoSQL查询中的对象中

public IQueryable<LinqExample.Core.Person> GetAll() {
    var people = from pe in this.db.Persons
                 select new Person {
                     Id = pe.id,
                     FirstName = pe.fname,
                     LastName = pe.lname,
                     Reports = this.GetReports(pe.id)
                 };
    return people;
}
public IQueryable GetAll(){
var people=来自此.db.peoples中的pe
选择新人{
Id=pe.Id,
FirstName=pe.fname,
LastName=pe.lname,
Reports=this.GetReports(pe.id)
};
还人,;
}

让我们在代码的其他地方定义一个
Person
类。更深入

坚果。我不是NHibernate的超级粉丝。谢谢。你能提供一些类似文档、博客或其他东西吗?链接?!哇。非常感谢你!我想我可能会坚持使用NHibernate,或者可能是亚音速。哦,好吧。我用一个链接更新了我的帖子,如果你仍然想使用LINQtoSQL,这个链接应该会对你有所帮助。另外,请查看我的博客(通过我的个人资料),我将在博客中讲述我当前项目中特别棘手的部分。