2010-02-01 5 views
3

За много примеров LINQ, которые я видел, я создаю свой собственный контекст данных и таблицы, используя код, аналогичный приведенному ниже:Это ложное предупреждение при использовании LINQ to SQL?

class MyDatabase : DataContext { 
    public Table<Widget> Widgets; 
    public Table<Car> Cars; 

    public MyDatabase (string connection) : base(connection) { } 
} 

Но для каждой таблицы (Widgets, автомобили и т.д.), Я получаю предупреждение Поле 'TableName' никогда не назначается. Я не могу найти никого в Google, у которого также есть эта проблема. Я не чувствую, что делаю что-то неправильно, потому что просто копирую примеры LINQ, которые я видел из разных мест. Итак, что случилось с этим предупреждением? Это предупреждает меня о реальной проблеме? Или я чего-то не хватает?

ответ

3

Да, они ложны. *

В this other question about how DataContext works мы узнаем, что конструктор DataContext использует рефлексию для заполнения полей во время выполнения. Поэтому Visual Studio дает вам предупреждение, основанное на знаниях, которые он имеет во время компиляции. Он не знает, что в конечном счете эти поля заполняются до того, как они будут потреблены.

* Ответ основан на чужом комментарии, найденном на SO. Может быть, даже ошибаюсь!

+0

Это не так, и да: предупреждение неверно: действительно, компилятор не может обнаружить отражение. –

+0

Тайна, решенная Марком и Марком, способ пойти ребятами. – Hogan

0

Предупреждение действительно, поскольку вы создали определение для виджетов и автомобилей, но они не назначены. Это должно заботиться о себе, когда вы создаете свой контекст данных. Вы в конечном итоге обратитесь к ним.

+0

Не могли бы вы подробнее рассказать об этом? Я уже потребляю Widgets и Cars, читая их. Я полагаю, что они автоматически заполняются базой LINQ. Итак, когда это предупреждение исчезнет? –

+0

Я только что проверил свой код. Я также написал свой собственный объект контекста данных. Вот как у меня есть все кодированные (извините, я не могу правильно форматировать) ///

Представляет таблицу Master.Enterprise в базовой базе данных. общественная таблица Предприятие { get {return GetTable (); } \t \t \t \t \t} –

+0

вы могли бы изменить свой ответ и сделать его проще для всех нас читать. – Hogan

0

Вы можете решить эту проблему, присвоив им null после объявления.

Комментарий ответ - Это не должно быть на той же строке, что и декларация, - где угодно после объявления и до ее использования. Такая же линия распространена и часто используется для инициализаторов, что и нужно, и почему компилятор жалуется.

+0

Вы имеете в виду на той же строке, что и декларация? Решарпер говорит, что это избыточно. –

+0

Это избыточно. По умолчанию они равны нулю. –

+0

Ну, я думаю, вы должны выбрать между предупреждением компилятора и предупреждением Resharper, или (как говорит Рэнди) ждать, пока вы закончите класс, и они больше не являются заглушками. – Hogan

Смежные вопросы