通过业务逻辑初始化Linq到Sql对象

时间:2009-03-27 10:35:30

标签: c# .net linq linq-to-sql business-logic

我想扩展Linq To Sql生成的类,以便在创建新对象(=行)时进行初始化。

我想在创建父行时向子表添加行。

我希望使用Oncreated(部分)方法做这样的事情:

partial class Product {
    partial void OnCreated() {
        // Fill default rows for FK relations
        this.Columns.Add(new ProductColumn {
            Name = "Name", ColumnType = 1
        });
        this.Columns.Add(new ProductColumn {
            Name = "Producer", ColumnType = 2
        });
    }
}

每次从构造函数调用OnCreated。因此,如果在调用OnCreated之后将从数据库加载对象。如果从数据库加载对象,则不要执行代码。

那么我在哪里可以为模型添加逻辑来初始化对象(-graph)?

4 个答案:

答案 0 :(得分:3)

在Linq to SQL生成的类中没有内置的方法。它们在从DB调用时专门调用OnLoaded,但是当它不是时它们不会调用任何东西。我怀疑因为没有办法确切地知道......

我建议使用Chris建议的工厂方法。

答案 1 :(得分:2)

使用LINQ-to-SQL,实体在很大程度上不知道父数据上下文 - 只有像EntitySet<T>这样的延迟加载成员才知道这个细节。您可以通过查看.IsDeferred(假设 延迟)来识别数据上下文感知实体集 - 如果涉及数据上下文则为true,否则为false - 但是还有其他问题:

  • LINQ-to-SQL附加数据上下文(用于延迟执行) 构造函数(和OnCreated)已执行
  • 如果您在OnCreated / .ctor()中手动添加项目,则当LINQ-to-SQL尝试附加数据上下文时它会中断
  • LINQ-to-SQL使用默认构造函数,这意味着泛型/ new()等也将共享此代码

不幸的是;不,我认为你不能以任何明智的方式在OnCreated中做到这一点。你可以:

  • 有第二个用于此用途的构造函数,它添加了额外的项目
  • 使用工厂方法,即正确构建项目的静态.Create()方法

(因为LINQ-to-SQL不会使用上述任何一种)

答案 2 :(得分:1)

我认为在这种情况下你最好使用Factory来创建你的实例;因此,您目前的任何地方都有如下代码:

Product p = new Product();

你会改为:

Product p = ProductFactory.CreateProduct();

您的CreateProduct()方法看起来像:

public Product CreateProduct()
{
    var p = new Product();
    p.Columns.Add(new ProductColumn {
        Name = "Name", ColumnType = 1
    });
    p.Columns.Add(new ProductColumn {
        Name = "Producer", ColumnType = 2
    });
    return p;
}

答案 3 :(得分:0)

如果您正在使用设计器 - 我认为您是因为使用了部分类 - 您可以在设计器中添加关联,并且相应的列将自动添加到您的对象中。 MSDN使用设计器工作界面对how to create associations进行了引用。