.net 实体框架与LINQ到SQL
既然.NETV3.5SP1已经发布(与VS2008SP1一起发布),我们现在可以访问.NETEntityFramework了 我的问题是。当试图决定使用实体框架和LINQtoSQL作为ORM时,有什么区别.net 实体框架与LINQ到SQL,.net,entity-framework,linq-to-sql,.net,Entity Framework,Linq To Sql,既然.NETV3.5SP1已经发布(与VS2008SP1一起发布),我们现在可以访问.NETEntityFramework了 我的问题是。当试图决定使用实体框架和LINQtoSQL作为ORM时,有什么区别 按照我的理解,实体框架(与LINQtoEntities一起使用时)是LINQtoSQL的“老大哥”?如果是这样,它有什么优势?它能做什么,而LINQ to SQL自己做不到的呢?在@lars posted的那篇文章中有一些明显的区别,但简短的回答是: L2S将对象属性与数据库的特定字段紧密耦
按照我的理解,实体框架(与LINQtoEntities一起使用时)是LINQtoSQL的“老大哥”?如果是这样,它有什么优势?它能做什么,而LINQ to SQL自己做不到的呢?在@lars posted的那篇文章中有一些明显的区别,但简短的回答是:
- L2S将对象属性与数据库的特定字段紧密耦合,或者更正确地将对象映射到特定数据库模式
- L2S只能与SQL Server一起工作(据我所知)
- EF允许将单个类映射到多个表
- EF将处理M-M关系
- EF将能够针对任何ADO.NET数据提供程序
最初的前提是L2S用于快速开发,EF用于更多的“enterprisey”n层应用程序,但这使得L2S的销量有点不足。我认为快速而肮脏的答案是
- LINQtoSQL是一种快速简便的方法。这意味着,如果你正在做一些更小的东西,你会走得更快,交付得更快
- 实体框架是一种全面、无障碍的方法。这意味着如果你正在做一些更大的事情,你会提前花更多的时间,发展较慢,并且有更多的灵活性
我的印象是,如果Linq2Sql不能满足您的需要,那么您的数据库非常庞大或设计非常糟糕。我有大约10个网站,无论大小都使用Linq2Sql。我已经看过和实体框架很多次了,但我找不到在Linq2Sql上使用它的好理由。也就是说,我尝试使用我的数据库作为模型,所以我已经有了模型和数据库之间的1对1映射
在我目前的工作中,我们有一个包含200多个表的数据库。一个旧的数据库,有很多糟糕的解决方案,因此我可以看到实体框架优于Linq2Sql,但我仍然希望重新设计数据库,因为数据库是应用程序的引擎,如果数据库设计糟糕且速度慢,那么我的应用程序也会很慢。在这样一个数据库上使用Entity framework似乎是一个快速修复方法,可以掩盖糟糕的模型,但它永远无法掩盖您从这样一个数据库中获得的糟糕性能。我在Entity framework方面的经验还不太好。首先,您必须从EF基类继承,所以向POCOs说再见。您的设计必须围绕EF。使用LinqtoSQL,我可以使用现有的业务对象。此外,没有延迟加载,您必须自己实现。有一些解决方法可以使用POCO和延迟加载,但它们存在于IMHO中,因为EF还没有准备好。我打算在4版以后再回到它。P>我想如果你需要开发一些快速的东西,中间没有奇怪的东西,你需要有实体来代表你的表:
Linq2Sql可以是一个很好的联盟,将它与LinQ一起使用可以释放出一个很好的开发时间。两者都不支持独特的SQL 2008数据类型。从我的角度来看,不同之处在于,在未来的某个版本中,实体仍然有机会围绕我的地理数据类型构建一个模型,而Linq to SQL将永远不会被放弃
想知道nHibernate或OpenAccess是怎么回事…我发现在使用EF时,我不能在同一个数据库模型中使用多个数据库。但是在linq2sql中,我可以只通过在模式名称前面加上数据库名称
这是我最初开始使用linq2sql的原因之一。我不知道EF是否允许此功能,但我记得阅读时,它是为了不允许此功能。我找到了一个非常好的答案,用简单的话解释了何时使用此功能: 使用哪种框架的基本经验法则是如何规划 在表示层中编辑数据
- Linq To Sql-如果您计划编辑一对一文档,请使用此框架
关系
var result = (from metattachType in _dbContext.METATTACH_TYPE join lineItemMetattachType in _dbContext.LINE_ITEM_METATTACH_TYPE on metattachType.ID equals lineItemMetattachType.METATTACH_TYPE_ID where (lineItemMetattachType.LINE_ITEM_ID == lineItemId && lineItemMetattachType.IS_DELETED == false && metattachType.IS_DELETED == false) select new MetattachTypeDto() { Id = metattachType.ID, Name = metattachType.NAME }).ToList();
return await _attachmentTypeRepository.GetAll().Where(x => !x.IsDeleted) .Join(_lineItemAttachmentTypeRepository.GetAll().Where(x => x.LineItemId == lineItemId && !x.IsDeleted), attachmentType => attachmentType.Id, lineItemAttachmentType => lineItemAttachmentType.MetattachTypeId, (attachmentType, lineItemAttachmentType) => new AttachmentTypeDto { Id = attachmentType.Id, Name = attachmentType.Name }).ToListAsync().ConfigureAwait(false);
return (from attachmentType in _attachmentTypeRepository.GetAll() join lineItemAttachmentType in _lineItemAttachmentTypeRepository.GetAll() on attachmentType.Id equals lineItemAttachmentType.MetattachTypeId where (lineItemAttachmentType.LineItemId == lineItemId && !lineItemAttachmentType.IsDeleted && !attachmentType.IsDeleted) select new AttachmentTypeDto() { Id = attachmentType.Id, Name = attachmentType.Name }).ToList();