Admire Mhlaba Ответов: 2

Как исправить "entitytype httppostedfilebase не имеет определенного ключа. Определите ключ для этой ошибки entitytype" в asp. Net MVC


Добрый день кодовые гуру, любезно помогите в разрешении этой ошибки :
EntityType 'HttpPostedFileBase' has no key defined. Define the key for this EntityType.

Я искал в Интернете решение, но все рекомендуемые исправления не решают эту ошибку. Вот предыстория моей проблемы, я недавно изменил свою модель данных сущностей с "EF Designer из базы данных (EDMX)" к "Сначала код из базы данных", причиной изменения стала ошибка, которую я получал при попытке разместить систему. Система не могла подключиться к серверу базы данных. Команда хостинга рекомендовала это изменение. Теперь я создал новый проект и скопировал код из старой системы. Когда я запускаю систему, я продолжаю получать эту ошибку «EntityType: EntitySet 'HttpPostedFileBases' основан на типе 'HttpPostedFileBase', для которого не определены ключи». см. ссылку журнала ошибок. Я также загрузил этот проект в свой Google drive, если вы хотите взглянуть на код, а затем загрузите его по приведенной ниже ссылке. Я был бы очень признателен за обратную связь от вас, ребята, спасибо, что нашли время из своего плотного графика, чтобы помочь.

Ошибочный Код
public tblLogin Search(string userEmail, string userPassword)
        {
            try
            {
                userPassword = HelperFunction.PasswordEncrypt(userPassword, ConfigurationManager.AppSettings["Encyptkey"]);

                return db.tblLogins.Where(user => user.Email.Equals(userEmail) && user.UserPassword.Equals(userPassword)).FirstOrDefault();
the error is thrown here, in fact whenever I try to query the database.
            }
            catch (Exception err)
            {
                ExceptionLogger.LogException(err, "[Controller: Account] [Action Method: Search(string userEmail, string userPassword)]");

                return null;
            }
        }



класс моделей
[Table("tblLogin")]
    public partial class tblLogin
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public tblLogin()
        {
            tblRecordKeys = new HashSet<tblRecordKey>();
        }

        public int Id { get; set; }

        [Required]
        [StringLength(100)]
        public string Email { get; set; }

        [Required]
        [StringLength(100)]
        public string UserPassword { get; set; }

        public int RoleID { get; set; }

        public int StateID { get; set; }

        public bool Verified { get; set; }

        public Guid AuthorizationCode { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<tblRecordKey> tblRecordKeys { get; set; }

        public virtual tblState tblState { get; set; }

        public virtual tblMember tblMember { get; set; }

        public virtual tblRole tblRole { get; set; }
    }


Класс Модели Метаданных

[MetadataType(typeof(ModelLogin))]
    public partial class tblLogin
    {
        [Display(Name = "Confirm Password"), System.ComponentModel.DataAnnotations.Compare("UserPassword", ErrorMessage = "Password Confirmation And Password Do Not Match"), Required(ErrorMessage = "Password Confirmation Is Required!")]
        public string ConfirmPassword { get; set; }
    }
    public class ModelLogin
    {
        [Key, Column(Order = 0)]
        public int Id { get; set; }

        [Required(ErrorMessage = "Email Address Is Required!"), Display(Name = "Email Address")]
        [RegularExpression(@"[a-zA-Z0-9\-_~]+(\.[a-zA-Z0-9\-_~]+)*@[a-zA-Z0-9\-_~]+(\.[a-zA-Z0-9\-_~]+)*\.[a-zA-Z]{2,}", ErrorMessage = "Invalid Email Address")]
        public string Email { get; set; }

        [Display(Name = "Password"), Required(ErrorMessage = "Password Is Required!")]
        public string UserPassword { get; set; }

        public int RoleID { get; set; }

        public bool Verified { get; set; }
    }



Ссылка На Журнал Ошибок : ErrorLog.txt -Google Диск[^]

Что я уже пробовал:

Я пробовал добавлять
Key Attribute

Аннотации данных к моим моделям, чтобы сообщить EF атрибут первичного ключа, но это не работает.

Kats2512

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

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

Admire Mhlaba

Спасибо, я так и сделаю.

2 Ответов

Рейтинг:
15

Admire Mhlaba

Мне удалось решить эту проблему, вот решение на тот случай, если кто-то там столкнется с подобной проблемой.

При использовании подхода Code First все свойства, добавленные в модель, которые не исходят из таблиц, должны быть украшены атрибутом аннотации данных [NotMapped], поскольку я использую модель данных code first, поля модели класса должны соответствовать столбцам базы данных.



например:

namespace Experiment.Models
{
   [MetadataType(typeof(ModelDepartment))]
   public partial class tblDepartment
   { 
      [
         NotMapped,
         Required,
         StringLength(50)
      ]

      public string DepBuilding { get; set; }

      [NotMapped]
      public HttpPostedFile UploadedFile { get; set; }
   }

   internal sealed class ModelDepartment
   {
      public int Id { get; set; }

      [Required]
      [StringLength(50)]
      public string DepName { get; set; }

      [Required]
      [StringLength(50)]
      public string DepHOD { get; set; }
   }
}


Рейтинг:
0

Dave Kreskowiak

Это ошибка Entity Framework, а не ASP.NET или MVC.

Вы просто не определили ключевое поле в классе под названием "HttpPostedFildBase". Все классы таблиц, используемые Entity Framework, должны иметь ключевое поле, называемое либо "Id", либо"<classname>Id".

Entity Framework основана на тоннах конвенций, поэтому я настоятельно рекомендую вам взять книгу по EF и поработать с ней, чтобы понять, как работают эти конвенции.


Admire Mhlaba

Добрый день, спасибо за ответ, но HttpPostedFildBase-это абстрактный класс внутри системы.Веб-пространство имен, используемое для хранения потоковых данных. Я не могу изменить этот класс. Я добавил атрибут [Key] в свое поле первичного ключа, но это не решает проблему.

Dave Kreskowiak

Значит, вы написали что-то очень неправильное. Как выглядит ваш класс DbContext? Тот, который определяет все элементы DbSet...

Admire Mhlaba

На самом деле это сообщение об исключении, которое я получаю из своего файла журнала ошибок. Вот ссылка для загрузки класса DBContext: https://drive.google.com/open?id=0By9xalH13y_lcUsycFBtTWJ0MFE

Dave Kreskowiak

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

Я в тупике.

Admire Mhlaba

Забавно, что я уже делал это раньше в других проектах, и все работает нормально. Я тоже сбит с толку. Ошибка недостаточно конкретна