您最喜欢将LINQ to SQL实体类和数据上下文类封装到业务对象中的方法是什么?

你发现在特定情况下工作了什么?

您是否已发明或采用任何特定模式?

有帮助吗?

解决方案

我发现了一种我认为效果最好的模式 - 至少在我的情况下。 点击搜索结果 我使用部分类扩展实体类。我使用部分类,因此实体的签名不会改变(参见 Delete 方法中的 DeleteOnSubmit 调用)。

我做了一个小例子。这是数据库和LINQ to SQL类设置的图像:

搜索结果 这是我实现业务逻辑的部分类:

/// <summary>
/// This class extends BusinessLogicDataContext.Products entity class
/// </summary>
public partial class Product
{
    /// <summary>
    /// New up a product by column: dbo.Products.ProductId in database
    /// </summary>
    public Product(Int32 id)
    {
        var dc = new BusinessLogicDataContext();

        // query database for the product
        var query = (
            from p in dc.Products 
            where p.ProductId == id 
            select p
        ).FirstOrDefault();

        // if database-entry does not exist in database, exit
        if (query == null) return;

        /* if product exists, populate self (this._ProductId and
           this._ProductName are both auto-generated private
           variables of the entity class which corresponds to the
           auto-generated public properties: ProductId and ProductName) */
        this._ProductId = query.ProductId;
        this._ProductName = query.ProductName;
    }


    /// <summary>
    /// Delete product
    /// </summary>
    public void Delete()
    {
        // if self is not poulated, exit
        if (this._ProductId == 0) return;

        var dc = new BusinessLogicDataContext();

        // delete entry in database
        dc.Products.DeleteOnSubmit(this);
        dc.SubmitChanges();

        // reset self (you could implement IDisposable here)
        this._ProductId = 0;
        this._ProductName = "";
    }
}

使用已实施的业务逻辑:

// new up a product
var p = new Product(1); // p.ProductId: 1, p.ProductName: "A car"

// delete the product
p.Delete(); // p.ProductId: 0, p.ProductName: ""

此外:LINQ to SQL实体类本质上非常开放。这意味着与 dbo.Products.ProductId 列对应的属性同时实现了getter和setter - 此字段不应更改。

据我所知,你不能使用部分类覆盖属性,所以我通常做的是实现一个使用接口缩小对象的管理器:

public interface IProduct
{
    Int32 ProductId { get; }

    void Delete();
}

其他提示

我倾向于使用Repository模式来封装DataContexts。

存储库模式

我想在使用LINQ2SQL的同时找到一种更好的方法从我的数据层发出POCO对象。

我刚刚发布了一个示例,说明如何使用IoC和T4模板构建使用Linq to Sql进行存储的应用程序。

http://daniel.wertheim.se/2010/03/14/linq-to-sql-how-to-separate-the-entities-and-the-datacontext/

现在我正在尝试将LINQ to SQL实体类用作业务对象,以便在函数和服务之间传递它们。

当然,您应该有用于数据库访问的单独实体类,因此您的数据库布局可以在不更改业务对象的情况下进行更改!

我也最感兴趣的是一个很好的解决方案!

查看Rob Conery整合的MVC示例应用程序的源代码:

http://www.codeplex.com/mvcsamples/

他有一个单独的实体层,映射到LINQ to SQL类。

我使用Entity Framework和Linq to Entities进行了一些实验,以此作为进一步将我的客户端代码与数据库分开的方法,但我发现它使用起来很笨并担心性能。

在我当前的项目中,我使用Linq to SQL作为我的数据层,但是我有单独的类来实现所有Linq查询。这些类返回在我的Linq to SQL上下文中定义的实体,但查询隐藏在方法中。

我通过 CodeBetter.com上的Ian Cooper Stephen Walther 系列非常宝贵理解首先编写POCO实体的必要性,然后将它们映射到数据库,而不是反过来做(这是我以前经常做的事情)。

我正在尝试拥有一个单独的OO模型层(更好地支持OO实践),但是使用LINQ to SQL。我们的想法是拥有一个自定义工具将用于生成代码的xml文件。 由于LINQ to SQL entites太杂乱了我的首选项,我将自动生成新类用作我的实体,当然DataContext将完全隐藏为客户端代码。 简短的回答是:创建新的实体类,但使用底层的LINQ to SQL实体和DataContext。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top