2

我有一些使用 LINQ-to-SQL 类的简单(C#、.Net 4.0)代码,我正在尝试“扩展”对象以添加我自己的字段。假设调用 LINQ 生成的类DatabaseRow,我想添加几个bool值供内部使用:

public class ExtendedDatabaseRow: DatabaseRow
{
   public bool ReadyToWrite;
   public bool Changed;
}

这在代码中可以正常工作:我可以创建类型ExtendedDatabaseRow等的对象。但是,我想然后将这些对象写回数据库。假设我想将对象changedRow(类型ExtendedDatabaseRow)写回数据库:

DataClassesDataContext dc = new DataClassesDataContext();
DatabaseRow newrow = (DatabaseRow) changedRow; // "Cast" the extended object back to the base type
dc.DatabaseRows.InsertOnSubmit(newrow);
dc.SubmitChanges();

这会引发错误

你调用的对象是空的。

尝试时InsertOnSubmit

我可以创建一个新DatabaseRow对象并从源对象复制每个参数,但这对我来说似乎有点混乱。我可以简单地将扩展对象转换回基础对象吗?如果可以,我做错了什么?还是我做得很好,而错误是更特定于 LINQ 的?

我对 C# 还是很陌生,尤其是使用的术语,所以如果这是一个愚蠢的问题,请提前道歉。

4

2 回答 2

6

您不需要派生一个新类来扩展 Linq To Sql 实体,这些类被标记为partial正是出于这个原因,例如

public partial class DatabaseRow
{
    public bool ReadyToWrite { get; set; }
    public bool Changed { get; set; }
}

这是扩展设计器生成的数据库实体的推荐方式,这意味着您不必强制转换。

于 2013-08-08T12:30:58.633 回答
1

IIRC,LINQ-to-SQL 创建部分类,因此您可以通过这种方式对其进行扩展;这可能是扩展 LINQ-to-SQL 类的默认方式。

也就是说,我不明白为什么你会在那里得到一个 Null 引用。您是否已通过代码检查newrow插入时是否有机会为空?

于 2013-08-08T12:32:16.460 回答