Производный класс заставляет InsertOnSubmit () генерировать исключение NullReferenceException - PullRequest
2 голосов
/ 09 сентября 2010

Я просмотрел соответствующие посты, на которые были даны ответы, но все равно получаю исключение 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 ]

2 голосов
/ 09 сентября 2010

LINQ-to-SQL уже поддерживает наследование, но только для типов в модели.Я предполагаю, что он ищет ваш пользовательский тип в модели (чтобы найти подходящую таблицу или дискриминатор) и терпит неудачу.

Короче говоря, я не думаю, что вы можете использовать подтипы, которые не являются частью модели.

Однако, типы: partial;вы должны быть в состоянии сделать:

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

, который добавляет ваше переопределение ToString() к сгенерированному типу .

1 голос
/ 09 сентября 2010

Спасибо, Марк, за то, что указал мне правильное направление.Чтобы решить эту проблему, я покончил с классом MyTransaction и в пространстве имен DataAccess, в котором содержатся классы DataContext и Linq-to-SQL, я переопределяю ToString() следующим образом:

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

}
}

Я сейчас использую Transaction там, где раньше использовал бы MyTransaction.

...