считыватель данных несовместим с указанным. не имеет соответствующего столбца в средстве чтения данных с таким же именем

Я продолжаю получать исключение ниже. Исключение сбивает меня с толку, потому что я не выбираю UserID.

Я попытался изменить выбор на SELECT *, но это просто приводит к тому, что result.Count равно 0, независимо от того, существуют данные или нет.

У меня есть фиктивная запись в базе данных под названием bob tob.

Я заметил, что если я наведу курсор на часть пользователей db.Users.SqlQuery.

Текст внутри есть

{SELECT 
[Extent1].[userID] AS [userID], 
[Extent1].[userFirstName] AS [userFirstName], 
[Extent1].[userLastName] AS [userLastName], 
[Extent1].[userName] AS [userName], 
[Extent1].[userEmail] AS [userEmail], 
[Extent1].[userPassword] AS [userPassword], 
[Extent1].[userStatus] AS [userStatus], 
[Extent1].[userEmailVerificationStatus] AS [userEmailVerificationStatus], 
[Extent1].[userActivationCode] AS [userActivationCode]
FROM [dbo].[Users] AS [Extent1]}

Я предполагаю, что он пытается выбрать все элементы класса User независимо? Если это правда, то как мне остановить это? Что мне не хватает?

Это исключение:

Средство чтения данных несовместимо с указанным «UserRegistrationPasswordsModel.User». Член типа userID не имеет соответствующего столбца в средстве чтения данных с таким же именем.

Ниже приведен код, вызывающий EmailExists. Я добавил ToString(), ложно надеясь, что проблема может быть в этом.

#region EmailExist
// Email already exists?
if (Utilities.EmailExists(user.userEmail.ToString()))
{
    // A pretty awesome way to make a custom exception
    ModelState.AddModelError("EmailExist", "Email already exists");

    // Bounce back
    return View(user);
}
#endregion

Ниже приведена процедура, которая должна проверить, существует ли электронная почта или нет.

#region EmailExists
    // Confirm if the Email exists or not
    public static bool EmailExists(string Email)
    {
        bool result = false;
        Models.UserRegistrationPasswordsEntities1 db = new Models.UserRegistrationPasswordsEntities1();
        var queryResult = db.Users.SqlQuery("SELECT userEmail FROM Users WHERE userEmail = @1;", 
                                                                          new SqlParameter("@1", Email)).FirstOrDefault();

        // the ternary opertor is pretty awesome
        result = queryResult.Result.GetType() == null ? false : true;

        return result;
    }
    #endregion

Это структура таблицы:

CREATE TABLE [dbo].[Users]
(
    [userID]                      INT              IDENTITY (1, 1) NOT NULL,
    [userFirstName]               VARCHAR (50)     NOT NULL,
    [userLastName]                VARCHAR (50)     NOT NULL,
    [userName]                    VARCHAR (50)     NOT NULL,
    [userEmail]                   VARCHAR (50)     NOT NULL,
    [userPassword]                VARCHAR (100)    NOT NULL,
    [userStatus]                  BIT              DEFAULT ((0)) NOT NULL,
    [userEmailVerificationStatus] BIT              DEFAULT ((0)) NOT NULL,
    [userActivationCode]          UNIQUEIDENTIFIER DEFAULT (newid()) NOT NULL,
    [userDateOfBirth]             DATETIME         NOT NULL,

    PRIMARY KEY CLUSTERED ([userID] ASC)
);

А это класс модели User:

public partial class User
{
    public int userID { get; set; }

    [Display(Name = "First Name")]
    [DataType(DataType.Text)]
    [Required(AllowEmptyStrings = false, ErrorMessage ="First name required")]
    public string userFirstName { get; set; }

    [Display(Name = "Last Name")]
    [DataType(DataType.Text)]
    [Required(AllowEmptyStrings = false, ErrorMessage = "Last name required")]
    public string userLastName { get; set; }

    [Display(Name = "Username")]
    [DataType(DataType.Text)]
    [Required(AllowEmptyStrings = false, ErrorMessage = "Username required")]
    public string userName { get; set; }

    [Display(Name = "Email")]
    [DataType(DataType.EmailAddress)]
    [Required(AllowEmptyStrings = false, ErrorMessage = "email is required")]
    public string userEmail { get; set; }

    [Display(Name = "Date Of Birth")]
    [DataType(DataType.DateTime)]
    [Required(AllowEmptyStrings = false, ErrorMessage = "Date of Birth is required")]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
    public DateTime userDateOfBirth { get; set;}


    [Display(Name = "Password")]
    [DataType(DataType.Password)]
    [Required(AllowEmptyStrings = false, ErrorMessage = "Password is required")]
    [MinLength(6, ErrorMessage = "Minimum of 6 characters required")]
    public string userPassword { get; set; }

    [Display(Name = "Confirm Password")]
    [DataType(DataType.Password)]
    [Required(AllowEmptyStrings = false, ErrorMessage = "Confirm password is required")]
    [Compare("userPassword", ErrorMessage = "Confirm password and password do not match")]
    public string userConfirmPassword { get; set; }

    public bool userStatus { get; set; }
    public bool userEmailVerificationStatus { get; set; }

    public System.Guid userActivationCode { get; set; }
}

Я потратил большую часть 2 часов, пытаясь понять это.

Ниже приведены ресурсы, к которым я обращался, пытаясь найти решение.

Любая помощь приветствуется.

https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/advanced-entity-framework-scenarios-for-an-mvc-web-application

https://forums.asp.net/t/1991176.aspx?+данные+читатель+является+несовместимым+с+указанной+моделью

Исключение несовместимого средства чтения данных из сопоставленных объектов EF

Считыватель данных несовместим с указанной Entity Framework

https://forums.asp.net/t/1980259.aspx?I+получить+эту+ошибку+данные+читатель+является+несовместимым+с+указанным+DBLaxmiTatkalModel+TblAttendence+A+член+типа+AttendenceId+не+имеет+соответствующий+столбец+в+устройстве+считывания+данных+с+темже+именем+

Что может вызвать исключение EntityCommandExecutionException в EntityCommandDefinition.ExecuteStoreCommands?


person Adam Schneider    schedule 02.04.2018    source источник
comment
comment
Это почти год, что вы делаете?   -  person Adam Schneider    schedule 20.12.2018
comment
Возможный дубликат — это способ очистки — закрыть похожие вопросы и оставить один с лучшими ответами. Дата не важна. См. meta.stackexchange.com/questions/147643/ Если вы согласны с тем, что он требует уточнения, пожалуйста, проголосуйте на meta.stackexchange.com/questions/ 281980/ . Если вы видите несколько дубликатов, вы должны выбрать один из них как канонический и проголосовать за закрытие других.   -  person Michael Freidgeim    schedule 20.01.2019


Ответы (1)


Ошибка говорит:

Член типа userID не имеет соответствующего столбца в средстве чтения данных с таким же именем.

Это означает, что результаты, возвращаемые вашим запросом, не соответствуют типу вашего объекта (User). И действительно, это не так - ваш запрос возвращает один столбец userEmail, в то время как тип User имеет гораздо больше столбцов (включая userID, упомянутый в сообщении об ошибке). Почему результаты должны соответствовать типу User? Поскольку вы запрашиваете эту сущность, выполняя db.Users.SqlQuery.

Ваш запрос также неверен (потому что '@1' - это не параметр, а литеральная строка), но это не имеет значения, потому что вам все равно не нужно использовать здесь необработанный sql-запрос. Просто делать:

public static bool EmailExists(string Email)
{        
    using (var db = new Models.UserRegistrationPasswordsEntities1()) {
        return db.Users.Any(c => c.userEmail == Email);
    }       
}

Если вы хотите выдавать произвольные sql запросы (хотя должен еще раз сказать, что в данном случае делать это совершенно незачем) - используйте db.Database.SqlQuery:

using (var db = new Models.UserRegistrationPasswordsEntities1()) {
    var email = db.Database.SqlQuery<string>(
        "SELECT userEmail FROM Users WHERE userEmail = @email",
        new SqlParameter("email", Email))
    .FirstOrDefault();
    ...
}
person Evk    schedule 02.04.2018
comment
извините, забыл упомянуть, что я написал это в одинарных кавычках, чтобы посмотреть, не было ли это причудой Entity. Я ценю ваш ответ, но мне бы очень хотелось сделать это с параметризованным запросом, чтобы обеспечить некоторую безопасность от Sql Injection. - person Adam Schneider; 02.04.2018
comment
@ user3119737 Запросы Entity Framework уже параметризованы. Таким образом, запрос, показанный в моем примере, уже безопасен для sql-инъекций. - person Evk; 02.04.2018
comment
В самом деле? Не то, чтобы я вам не верил, но у вас есть подтверждающие документы? Я только что провел быстрый поиск в Google и нашел это docs.microsoft.com/en-us/dotnet/framework/data/adonet/ef/. В нем конкретно указано, что Entity Queries не защищены от атак Sql Injection, и вы должны создавать запросы с параметрами. - person Adam Schneider; 02.04.2018
comment
Конечно, да, кто бы вообще использовал Entity Framework, если бы это было не так? db.Users.Any(c => c.userEmail == Email) будет преобразован в параметризованный запрос, аналогичный вашему (но лучше). - person Evk; 02.04.2018
comment
В этой статье говорится о Entity SQL. Это отличается от того, что показано в ответе. Entity SQL — это SQL-подобный язык, специфичный для инфраструктуры сущностей, который вам почти никогда не нужно использовать на практике. - person Evk; 02.04.2018
comment
Так? entityframeworktutorial.net/querying-with-edm.aspx . См. ниже синтаксис запроса Linq. - person Adam Schneider; 02.04.2018
comment
Это не Entity SQL, если вы спросите об этом. Это запрос LINQ, который безопасен для sql-инъекций в структуре сущностей (то же самое, что я использую в своем ответе). - person Evk; 02.04.2018
comment
Если вы все еще сомневаетесь, выполните db.Database.Log = Console.WriteLine и наблюдайте за запросами, сгенерированными EF, в консоли, пока вы делаете запросы LINQ. - person Evk; 02.04.2018
comment
Ударь меня по лицу. это было @1. :фейспалм:. Я сделаю то, что вы сказали, и посмотрю db.Database.log. Спасибо большое. Я потратил столько времени на такую ​​глупую опечатку. - person Adam Schneider; 02.04.2018