IntelliSense Linq to SQL не знает таблиц в объекте datacontext - PullRequest
3 голосов
/ 31 октября 2010

Я могу успешно подключиться к базе данных с моим объектом 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 Ответ

4 голосов
/ 31 октября 2010

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

// 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 # - safe и статически типизированный язык.Хотя объект, на который ссылается ваша ссылка, действительно, во время выполнения , будет иметь свойства, которые вы ожидаете, компилятор не позволит этой компиляции, потому что эти свойства не существуют в переменной тип.

...