2

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

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

我希望使用 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

4 回答 4

3

在 Linq to SQL 生成的类中没有内置的方法。当从数据库调用时,它们会专门调用 OnLoaded,但如果不是,它们不会调用任何东西。我怀疑是因为没有办法确定...

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

于 2009-03-30T20:11:30.437 回答
2

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

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

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

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

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

于 2009-03-31T08:26:01.200 回答
1

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

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;
}
于 2009-03-30T14:58:15.993 回答
0

如果您正在使用设计器——我认为您是因为您使用的是部分类——您可以在设计器中添加关联,并且相应的列将自动添加到您的对象中。MSDN 提供了有关如何使用设计器工作表面创建关联的参考。

于 2009-03-27T10:45:51.773 回答