Вот моя модель с соответствующими перечислениями ниже, которые я использую с entity framework 5 и asp.net mvc4 codefirst. Я также использую переносимый файл базы данных (.mdf)

public class Project
    {
        public Project()
        {
            Images = new List<ProjectImage>();
        }

        public int ProjectId { get; set; }
        [Required]
        public string Title { get; set; }
        public virtual ICollection<ProjectImage> Images { get; set; }
        public string Description { get; set; }
        public ProjectType Type { get; set; }
        public ProjectState State { get; set; }
    }

    public enum ProjectType
    {
        Phone,
        Web,
        Windows
    }

    public enum ProjectState : byte
    {
        InProgress,
        NotStarted,
        Done
    }

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

Я тоже пробовал сохранять правки, и происходит то же самое.

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

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

Создать метод публикации

[HttpPost]
        public ActionResult Create(Project project, HttpPostedFileBase file)
        {
            try
            {
                if (file != null && file.ContentLength > 0 && file.ContentType.Contains("image"))
                {
                    //create a new unique filename with using guid, filename and project title
                    string relativePath = Constants.PortfolioImagesBaseFolder + 
                                        project.Title.Replace(" ", "") + 
                                        Guid.NewGuid().ToString() +
                                        Path.GetFileName(file.FileName);

                    string absolutePath = Server.MapPath(relativePath);

                    //save the file
                    file.SaveAs(absolutePath);

                    if (ModelState.IsValid)
                    {
                        project.Images.Add(new ProjectImage()
                        {
                            IsProjectMainImage = true,
                            Url = relativePath,
                            Title = "Main Project Image"
                        });
                        context.Projects.Add(project);
                        context.SaveChanges();

                        return RedirectToAction("Index");
                    }
                }

                ViewBag.ProjectTypes = CreateSelectListFromEnumType<ProjectType>();

                ViewBag.ProjectStates = CreateSelectListFromEnumType<ProjectState>();

                return RedirectToAction("Index");
            }

Изменить метод публикации

[HttpPost]
        public ActionResult Edit(int id, Project project)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    //Project projectFromDb = context.Projects.Single(p => p.ProjectId == id);
                    //projectFromDb.State = project.State;
                    //projectFromDb.Type = project.Type;
                    //projectFromDb.Title = project.Title;
                    //projectFromDb.Description = project.Description;
                    EntityState entityState = context.Entry(project).State;
                    context.Entry(project).State = EntityState.Modified;
                    context.SaveChanges();
                    return RedirectToAction("Index");
                }

                ViewBag.ProjectTypes = CreateSelectListFromEnumType<ProjectType>();

                ViewBag.ProjectStates = CreateSelectListFromEnumType<ProjectState>();

                return View(project);
            }

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

3
Lamin Sanneh 5 Янв 2013 в 03:04
Вы проверяли, что на самом деле сохраняется в базе данных? Мне кажется, что свойства перечисления где-то не инициализируются, и поэтому значения по умолчанию сохраняются. Вопрос в том, происходит ли это из-за того, что вы сохраняете со значениями по умолчанию или из-за ошибки вы игнорируете то, что читаете из базы данных, и назначаете значения по умолчанию, которые позже сохраняются.
 – 
Pawel
5 Янв 2013 в 05:02
Я инициализирую значения перечисления, как я уже упоминал выше, пошаговое выполнение кода показывает, что они сохраняются вместе с опубликованным значением формы, но что странно, так это то, что свойства перечисления не имеют соответствующего столбца в базе данных, которую создает codefirst. Это нормальное поведение или нет?
 – 
Lamin Sanneh
5 Янв 2013 в 06:08
2
"что странно, так это то, что свойства перечисления не имеют соответствующего столбца в базе данных", это ваша проблема. Вы используете .NET Framework 4 или .NET Framework 4.5? Или вы ориентируетесь на .NET Framework 4?
 – 
Pawel
5 Янв 2013 в 06:45
Спасибо @Pawel, похоже, я нацелился на .net4 вместо 4.5, что не позволило мне использовать последнюю версию entity framework. При переходе на 4.5 столбцы enum были добавлены в таблицы в базе данных.
 – 
Lamin Sanneh
5 Янв 2013 в 07:29

1 ответ

Лучший ответ

В соответствии с вашими комментариями - поскольку вы нацелены на .NET Framework 4, свойства перечисления не были обнаружены и добавлены в модель, поскольку EF 4, который был частью .NET Framework 4, не поддерживал перечисления, и приложение не будет работать на машине, на которой есть только Установлена ​​.NET Framework 4 (а не .NET Framework 4.5, которая является обновлением на месте). По той же причине, по которой EF5, установленный в проекте, ориентированном на .NET Framework 4, не позволяет использовать функции, доступные в EF5 (перечисления, геопространственные типы, TVF и другие), при ориентации на .NET Framework 4.5. Перенацеливание вашего проекта на .NET Framework 4.5 и переустановка EF5 сделает все эти функции доступными.

5
Pawel 5 Янв 2013 в 09:07