IntelliSense Linq to SQL не знает таблиц в объекте datacontext

Я могу успешно подключиться к базе данных с моим объектом datacontext. Я могу успешно читать и писать в базу данных, но не могу использовать тот же синтаксис, который используют другие.

Например, когда я хочу данные из таблицы, я должен сделать что-то вроде этого:

db = new UserDataDataContext(WebConfigurationManager.ConnectionStrings["UserData"].ConnectionString);
IQueryable Users = db.GetTable<User>();

Я хотел бы иметь возможность писать запросы linq, например, как я вижу, что другие делают их:

db = new UserDataDataContext(WebConfigurationManager.ConnectionStrings["UserData"].ConnectionString);
var query = from u in db.User
            where u.UserName == "Test"
            select u;

Но intellisense не распознает пользователя как свойство db и, следовательно, не будет компилироваться. Intellisense не показывает никаких свойств, которые выглядят как связанные с таблицами или объектами моей базы данных.

Вот сообщение об ошибке, которое я получаю:

'System.Data.Linq.DataContext' does not contain a definition for 'User' and no extension method 'User' accepting a first argument of type 'System.Data.Linq.DataContext' could be found (are you missing a using directive or an assembly reference?)

Вот краткое изложение того, что я делаю:

Я использовал конструктор баз данных, перетаскивал таблицы в то, что хотел.

Затем я сохранил его как файл dbml.

Затем он создал новый класс, который расширяет dataContext для меня, с именем UserDataDataContext. Затем я создаю новый экземпляр UserDataDataContext с именем db, передавая строку подключения из Web.config.

Затем я пытаюсь написать запрос linq, ссылающийся на имена таблиц как свойства объекта db, но он не распознает их.

Я не могу понять, что я делаю неправильно, по сравнению со всеми примерами, которые я прочитал. Есть идеи?

1 ответ

Решение

Я уверен, что у вас где-то есть следующее объявление переменной:

// variable is of type System.Data.Linq.DataContext
DataContext db;

Измените это на:

// variable is now of the appropriate subclass's type
UserDataDataContext db;

Если db является локальной переменной, и вы можете позволить встроить инициализацию и объявление вместе, было бы даже лучше использовать неявную типизацию:

// db is implicitly of type UserDataDataContext
var db = new UserDataDataContext(WebConfigurationManager.ConnectionStrings["UserData"].ConnectionString);

C# - безопасный и статически типизированный язык. Хотя объект, на который ссылается ваша ссылка, действительно, во время выполнения будет иметь ожидаемые свойства, компилятор не позволит скомпилировать его, потому что эти свойства не существуют для типа переменной.

Другие вопросы по тегам