派生类导致InsertOnSubmit()抛出NullReferenceException

时间:2010-09-09 10:51:46

标签: c# linq linq-to-sql nullreferenceexception

我确实查看了已回答的相关帖子,但仍然在NullReference中获得InsertOnSubmit()例外。
我有一个自动生成的LINQ类事务,我从中创建一个覆盖ToString()的派生类:

public partial class MyTransaction:DataAccess.Transaction
{
    public MyTransaction():base()
    {

    }

    public override string ToString()
    {

        return "some text";
    }

}   

插入如下:

public bool InsertTransaction(Transaction t)
    {
        using (MarketPricesDataContext dataContext = new MarketPricesDataContext(connectionString))
        {
            try
            {                
                dataContext.Transaction.InsertOnSubmit(t);
                dataContext.SubmitChanges();
                return true;
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message);
                return false;
            }
        }

    }

我认为从MyTransaction调用基础构造函数可以解决我的问题,但事实并非如此。我可以插入交易项目但是当我尝试插入MyTransaction项目时,我得到NullReferenceException 这有效:

Transaction t=new Transaction();
t.Type="A"; //set some values
Data d=new Data();
d.InsertTransaction(t);

这会在NullReferenceException中抛出InsertOnSubmit()(对象引用未设置为对象的实例。)

MyTransaction myt=new MyTransaction();
myt.Type="A"; //set some values
Data d=new Data();
d.InsertTransaction(myt as Transaction);

我做错了什么?

2 个答案:

答案 0 :(得分:2)

LINQ-to-SQL已经支持继承,但仅适用于模型中的类型。我想它正在模型中寻找你的自定义类型(找到合适的表或鉴别器),然后失败。

简而言之,我认为您不能使用不是模型的一部分的子类型。

但是,类型为partial;你应该能够做到:

namespace MyTransaction:DataAccess {
    partial class Transaction {
        public override string ToString() {
            return "some text";
        }
    }  
}

将您的ToString()覆盖添加到生成的类型中。

答案 1 :(得分:1)

感谢Marc指出我正确的方向。为了解决这个问题,我取消了MyTransaction类,并在DataAccess命名空间中,包含DataContext和Linq-to-SQL类的类,我重写ToString()如下:

namespace DataMining.DataAccess
{
public partial class Transaction
{
    public override string ToString()
    {
      return "some text";
    }

}
}

我现在使用Transaction之前我曾使用MyTransaction