2010-02-05 27 views
0

最后,我决定从传统的ado.net数据集转换到Linq2Sql。从数据集转移到Linq2Sql之前我应该​​知道什么?

我没有将现有的项目迁移到Linq2Sql,但是从现在起,我将在新项目中使用Linq2Sql。我负责在我工作的应用程序的主要设计,所以我期待从你那里得到答案,以便在这种转变过程中我必须小心谨慎。

我也想知道Linq2Sql中使用的数据访问技术是什么。在实际的Linq2Sql对象弹出之前,是否有任何实际与数据库交谈并获取数据的底层数据访问驱动程序?这如何与Linq2Sql一起工作?

数据集和Linq2sql完全不同而且彼此不同?有什么共同点或共享点?

是否有任何抽象验证框架可用于Linq2Sql属性驱动?

几件事我知道到目前为止..

  • LINQ2SQL没有比其他SqlServer的原生支持。
  • 在SubmitChanges()调用期间,所有操作都被封装到一个事务中。

让我知道你想我应该知道我在做 或更新我如果我目前了解 什么错移更多的事情。

谢谢。

回答

1

对我来说,可笑的(和人为的)MSSQL搭档是Linq2Sql启动时立即显示的阻止。我选择了NHibernate。

2

因为我公司在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确实需要一些习惯,但一旦你明白了它,它就会起作用。根据我的经验,为了让这项技术感到舒适,我必须克服一些障碍。

  1. LINQ到SQL效果最好,如果你的数据库结构是健全的。尽可能坚持标识主键,并限制组合主键的数量。LINQ-to-SQL可以与复合材料一起使用,但从长远来看,如果您坚持单字段整数,它会更容易。如果你有你想管理自己的外键关系......不要!设置他们,让他们去...因为...

  2. 您需要让LINQ到SQL管理您的密钥。这是主要的和外国的......它会发现它们。传统的SQL应用程序开发期望开发人员将键分配给子记录并与它们进行连接。 LINQ到SQL是完全相反的。如果你明确指定了一个连接表达式(如在pkValue = fkValue中),那么你做错了什么。 LINQ引擎使用键值来构建幕后的SQL语句。如果您手动更改该值,那么LINQ引擎将不知道它需要做什么,因此不要单独使用这些键。

  3. 尽快学习和使用lambdas。理解查询工作得很好,它使得技术的平滑过渡成为可能。但是,由于理解查询与SQL语言之间的语法相似性很强,因此您可能难以放下一些可能会延迟转换成功的坏习惯。在我看来,Lambda查询更短,并允许更多的灵活性。

  4. 不要将您的数据库分成小的DataContexts。打开Visual Studio模型设计器并将所有表格拖放到一个DataContext中。如果您需要更改表格结构的定义,请在数据库中更改表格,从模型中删除相应的实体,然后将表格从服务器资源管理器中重新拖回。您的表格结构和关联会自动更新,并且您已准备好再次滚动。

  5. 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的资格非常好,我不需要在一年内编写或维护存储过程。

+0

我差点忘了......你绝对,肯定,毫无疑问需要下载LINQPad副本(www.linqpad.net)。它是LINQ可用的最好的学习工具之一...而且它是免费的。 – 2010-02-07 22:11:09

0

一些不那么令人兴奋的点(如由Neil制作的成品):

  • LINQ2SQL,取而代之EF
  • 但EF 3.5已经停产远远落后LINQ2SQL 3.5
  • 实体框架4(看起来非常实用)取决于4.0应用程序池
  • 如果您喜欢POCO(并使用3.5),您可能需要一个包装程序将DTOs内容传递到您的'消毒'版本
  • NHi bernate有Linq2NHibernate在当前版本
0

的事情,我碰上相当成熟到..

  • LINQ2SQL对象是“**连接” 到DataContext
    这可能很烦人..尤其是,在多层。
    用一个上下文获取并更新另一个上下文非常困难。
    数据集是独立/从适配器断开..

  • SQL服务器只有

  • 有关的WinForms,为绑定没有很好的支持(collectionchanges)

这看起来一切非常消极。但是,对于web开发。 LINQ2SQL是伟大的..

相关问题