因为我公司在SQL Server上标准化,采用LINQ-to-SQL并没有什么大不了的。我不得不承认,过去我一直被微软摧毁,而且几乎传递了LINQ to SQL,当传言厂商对于Entity Framework 2.0推出后放弃这项技术感到兴奋不已。我一直在使用LINQ到SQL约九个月。多年以来,我一直在寻找一个.NET数据层解决方案,最终使我不必编写或管理另一个存储过程来访问我的数据。根据我目前的项目,我认为我找到了胜利者。
LINQ-to-SQL将数据库模式抽象为.NET对象。使用LINQ-to-SQL查询语法,内部引擎将编译后的查询转换为SQL语句。到目前为止,你知道的几件事是正确的。我从来没有成为ADO.NET的粉丝......特别是DataSets。足迹太大,你必须处理这么多的代码才能得到结果集。 LINQ-to-SQL确实需要一些习惯,但一旦你明白了它,它就会起作用。根据我的经验,为了让这项技术感到舒适,我必须克服一些障碍。
LINQ到SQL效果最好,如果你的数据库结构是健全的。尽可能坚持标识主键,并限制组合主键的数量。LINQ-to-SQL可以与复合材料一起使用,但从长远来看,如果您坚持单字段整数,它会更容易。如果你有你想管理自己的外键关系......不要!设置他们,让他们去...因为...
您需要让LINQ到SQL管理您的密钥。这是主要的和外国的......它会发现它们。传统的SQL应用程序开发期望开发人员将键分配给子记录并与它们进行连接。 LINQ到SQL是完全相反的。如果你明确指定了一个连接表达式(如在pkValue = fkValue中),那么你做错了什么。 LINQ引擎使用键值来构建幕后的SQL语句。如果您手动更改该值,那么LINQ引擎将不知道它需要做什么,因此不要单独使用这些键。
尽快学习和使用lambdas。理解查询工作得很好,它使得技术的平滑过渡成为可能。但是,由于理解查询与SQL语言之间的语法相似性很强,因此您可能难以放下一些可能会延迟转换成功的坏习惯。在我看来,Lambda查询更短,并允许更多的灵活性。
不要将您的数据库分成小的DataContexts。打开Visual Studio模型设计器并将所有表格拖放到一个DataContext中。如果您需要更改表格结构的定义,请在数据库中更改表格,从模型中删除相应的实体,然后将表格从服务器资源管理器中重新拖回。您的表格结构和关联会自动更新,并且您已准备好再次滚动。
LINQ-to-SQL不直接支持多对多的关系,但你仍然可以使它工作。
例如,为了获得地址列表单个公司:
// Structure
// Company
// =======
// Company_ID int not null identity (1, 1)
//
// Address
// =======
// Address_ID int not null identity (1, 1)
// Company_ID int (FK to Company)
// Comprehension
var result = from a in DataContext.Companies
from b in DataContext.Addresses
where (a.Company_ID == 7)
select b.Addresses;
// Lambda
var result = DataContext.Companies.Where(a => a.Company_ID == 7).Addresses;
为了解决许多一对多的问题,您需要使用关联表作为父。使用上面的例子,让我们添加一个客户表和检索客户列表为特定的公司:
// Structure
// Customer
// ========
// Customer_ID int not null identity (1, 1)
//
// Customer-Company
// ================
// CustomerCompany_ID int not null identity (1, 1)
// Customer_ID int (FK to Customer)
// Company_ID int (FK to Company)
var customers = DataContext.CustomerCompanies
.Where(a => a.Company_ID == 7)
.Select(a.Customer);
现在,让我们创建一个新的客户和她同一个品牌的新公司关联:
Customer customer = new Customer();
Company company = new Company();
company.CustomerCompanies.Add(new CustomerCompany { Customer = customer });
DataContext.Companies.InsertOnSubmit(company);
DataContext.SubmitChanges();
我想我可能会快一点,所以让我解释发生了什么。我创建了一个新的Customer对象(或实体)和一个新的公司实体。由于LINQ-to-SQL正在管理外键关系,因此我可以直接从新创建的公司实体中引用关联实体集(CustomerCompanies)。我添加了一个新的CustomerCompany实体,我将Customer属性设置为新的Customer对象。由于我将CustomerCompany实体添加到新公司实体,因此它知道要更新这两个实体之间的外键引用。调用InsertOnSubmit()
标志公司实体插入,除了LINQ-to-SQL引擎在检查对象时发现的任何其他更改。调用SubmitChanges()
告诉引擎,以解决目前的变更,其中包括:
- 我们明确地插入
- ,当我们把它添加到CustomerCompany实体隐式的插入Customer实体的公司实体,并
- 的我们创建的CustomerCompany实体用于保存新的Customer实体。
此外,LINQ引擎自动分配并解析主键和外键(请参阅上面的#2)。
关于验证框架,我已经受够了城堡验证库很好的经验。它与我目前的MVC项目非常协调,并且计划将其纳入未来的项目中。
我一直采取微软的技术与一粒盐。大多数情况下,他们做出了很好的东西,但从我看到他们的东西已经很长时间了,我认为这是伟大的技术。基于简单的事实,我认为LINQ-to-SQL的资格非常好,我不需要在一年内编写或维护存储过程。
我差点忘了......你绝对,肯定,毫无疑问需要下载LINQPad副本(www.linqpad.net)。它是LINQ可用的最好的学习工具之一...而且它是免费的。 – 2010-02-07 22:11:09