LINQ to SQL 类到我自己的类

Posted

技术标签:

【中文标题】LINQ to SQL 类到我自己的类【英文标题】:LINQ to SQL classes to my own classes 【发布时间】:2010-12-14 11:20:05 【问题描述】:

我正在考虑将 LINQ to SQL 用于我正在处理的新项目,但我不想将 LINQ 类公开给我的应用程序。例如,在链接中进行选择会返回 System.Linq.IQueryable 集合。同样,为表示数据库而生成的所有类都使用 Table、Column、EntityRef 类和属性。如果我的数据访问层有 LINQ 依赖关系,那很好,但我不希望我的应用程序有。

所以我的想法是,我将不得不使用 LINQ to SQL 生成的类作为不暴露在我的数据访问层之外的中间类,并创建我自己的应用程序可以使用的类。将数据从 LINQ to SQL 类获取到我自己的类中的最简单/有效的方法是什么?

【问题讨论】:

【参考方案1】:

我完全同意你的想法——我会尽量避免将 LINQ to SQL 实体直接暴露给世界。

我绝对会推荐使用您自己的“域模型”,可以是底层 LINQ to SQL 实体的 1:1 镜像,也可以是不同的。

只要您有一个与底层 LINQ to SQL 实体非常相似的域模型,您就可以使用 AutoMapper 等工具轻松地在您的 LINQ to SQL 实体和域模型类之间打乱数据。这样做应该非常容易和灵活!

【讨论】:

【参考方案2】:

Rob Conery 发布了一个名为 MVC-Storefront 的网络广播系列,他在其中介绍了实现您想要的存储库模式的变体。

我在一个相当大的项目中使用了截屏视频中的想法,并且对结果非常满意。

但是,该模式存在一些问题,尤其是在并发和分离场景方面,您需要在完全投入使用之前预先考虑。

我在here这种模式中详细说明了我对并发的一些痛苦。

【讨论】:

【参考方案3】:

我会对您收到的回复感兴趣,因为我正在考虑完全相同的事情。我想在我们的后端使用 L2S 实体类,但使用更轻量级的实体来使用应用程序。

兰迪

【讨论】:

【参考方案4】:

我建议不要在新项目中使用 LINQ to SQL,因为微软将不再开发这个项目,除非可能会微调一些问题。 LINQ to SQL 完全可用并且可以接受,但我不建议新项目使用它。如果您喜欢 LINQ to SQL,则绝对应该考虑使用 Entity Framework 而不是 LINQ to SQL。

【讨论】:

我不知道这一点,并进行了一些谷歌搜索以找到支持您评论的来源。有很多似乎证实了你的评论,但我确实发现这个提供了更多的洞察力。看来 LINQ to SQL 不会彻底消亡,而是会与实体框架合并并继续发展:infoq.com/news/2008/11/DLINQ-Future【参考方案5】:

这是我目前的化身:

我有一个 DataContext 类,它是通过添加一个 LINQ to SQL 类并将表拖放到设计器上而创建的。我调用了 MyDataContext 类并将其放在名为 Linq 的命名空间中。我的数据库有一个名为 Tag 的表,它生成了一个类,也在 Linq 命名空间中。我将所有访问器都更改为内部访问器,因此它们在数据访问层之外不可见。

namespace Linq

    [System.Data.Linq.Mapping.DatabaseAttribute(Name="MyDb")]
    internal partial class MyDataContext : System.Data.Linq.DataContext
    
        ...
    

    [Table(Name="dbo.vTag")]
    internal partial class Tag
    
        ....
    

然后我创建了一个名为 DataAccess 的类,它将向任何引用该程序集的应用程序公开。我还创建了自己的 Tag 类。 DataAccess 类和我的新 Tag 类位于名为 Data 的不同命名空间中,以避免与 Linq 命名空间中生成的类发生冲突。我使用 Linq to Sql 查询 Linq.Tag 对象的 IList,然后使用 Linq 从 Linq.Tag 对象生成 Data.Tag 对象列表。

我想听听 cmets 对此的看法,看看是否有更高效的方法可以做到这一点,或者需要更少的代码。我对使用重复的类名(标签)也不太满意,所以我也很想听听关于命名建议的任何想法。

namespace Data

    public class DataAaccess
    
        public IList<Tag> List_Tags()
        
            using (Linq.MyDataContext dal = new Linq.MyDataContext ())
                            
                IList<Linq.Tag> lstTags =  (from c in dal.Tags select c).ToList();

                return (from tag in lstTags
                        select new Data.Tag()
                            
                                ID = tag.ID,
                                Name = tag.Name,
                                Parent_ID = tag.Parent_ID
                            ).ToList();
            
        
    

【讨论】:

【参考方案6】:

您的建议是拥有两个独立的模型。这意味着我发现没有必要的样板代码。我和你有或多或少的想法,但意识到这没有用。我在这个帖子的另一个答案中建议了Entity Framework,我想在这里再次说明这一点。

你最终得到的是一个模型汤,你必须在其中维护两个模型,而不仅仅是一个。这绝对是不可取的。

【讨论】:

我倾向于同意,它在某种程度上是一种两种模型的混合体,但您还有什么建议将底层依赖项(linq 到 sql 或实体框架)从传递给应用程序中删除? 您可以随时使用 AutoMapper(来自 Codeplex)之类的工具轻松地为您执行此操作......codeplex.com/AutoMapper【参考方案7】:

从 LINQ 到 SQL 类到您的类是一些相当简单的 LINQ 到对象(或只是初始化单个对象)的问题。

从您的模型返回到 LINQ to SQL 对象更有趣,但这是相当标准的东西(尽管我仍在努力,或者我会为您找到一些具体的参考资料)。

【讨论】:

以上是关于LINQ to SQL 类到我自己的类的主要内容,如果未能解决你的问题,请参考以下文章

如何将 LINQ-to-SQL 映射到 BLL 类?

NHibernate 或 LINQ to SQL [关闭]

Linq to Sql:更新之属性遍历法

利用LINQ to SQL 增删改查本地数据库

LINQ体验(18)——LINQ to SQL语句之视图和继承支持

Linq to Sql 与动态数据库