【问题标题】:Why is Entity Framework not saving enum properties on my model properly?为什么实体框架没有在我的模型上正确保存枚举属性?
【发布时间】:2013-01-04 23:04:31
【问题描述】:

这是我的模型,下面是它们的相关枚举 我与实体框架 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
    }

从视图回发模型后,除枚举字段外,所有字段都正确保存到数据库中。它们会被保存,但即使在视图中选择了不同的值后,也只会保存每种枚举类型的第一个值。

我也尝试过保存编辑,结果也是一样。

我已经逐步完成了我的 create post 方法的开始,在我的上下文中调用 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 上查看了很多答案,但没有一个可以帮助我,干杯,因此在提问之前等待两天。

【问题讨论】:

  • 您检查过数据库中实际保存的内容吗?在我看来,枚举属性似乎没有在某处初始化,因此正在保存默认值。问题是它发生是因为您使用默认值保存,还是由于错误,您忽略了从数据库中读取的内容并分配了稍后保存的默认值。
  • 我确实初始化了枚举值,正如我上面提到的,逐步执行代码显示它们与发布的表单值一起保存,但奇怪的是枚举属性在 codefirst 创建的数据库中没有对应的列.这是正常行为吗?
  • '奇怪的是枚举属性在数据库中没有对应的列'这是你的问题。您使用的是 .NET Framework 4 还是 .NET Framework 4.5?还是您的目标是 .NET Framework 4?
  • 感谢@Pawel,看来我的目标是 .net4 而不是 4.5,它不允许我使用最新版本的实体框架。切换到 4.5 并将枚举列添加到数据库中的表中。

标签: c# asp.net-mvc entity-framework enums ef-code-first


【解决方案1】:

根据您的 cmets - 由于您以 .NET Framework 4 为目标,因此未发现枚举属性并将其添加到模型中,因为 .NET Framework 4 的一部分的 EF 4 不支持枚举并且应用程序无法在机器上运行仅安装了 .NET Framework 4(而不是就地更新的 .NET Framework 4.5)。出于同样的原因,安装在面向 .NET Framework 4 的项目中的 EF5 不允许在面向 .NET Framework 4.5 时使用 EF5 中可用的功能(枚举、地理空间类型、TVF 等)。将您的项目重新定位到 .NET Framework 4.5 并重新安装 EF5 将使所有这些功能都可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多