Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么实体框架不能正确保存模型上的枚举属性?_C#_Asp.net Mvc_Entity Framework_Enums_Ef Code First - Fatal编程技术网

C# 为什么实体框架不能正确保存模型上的枚举属性?

C# 为什么实体框架不能正确保存模型上的枚举属性?,c#,asp.net-mvc,entity-framework,enums,ef-code-first,C#,Asp.net Mvc,Entity Framework,Enums,Ef Code First,下面是我的模型及其相关枚举 我正在使用entity framework 5和asp.net mvc4 codefirst。 我还使用可移植数据库文件(.mdf) 公共类项目 { 公共工程() { 图像=新列表(); } 公共int ProjectId{get;set;} [必需] 公共字符串标题{get;set;} 公共虚拟ICollection映像{get;set;} 公共字符串说明{get;set;} 公共项目类型类型{get;set;} 公共项目状态状态{get;set;} } 公共枚举项

下面是我的模型及其相关枚举 我正在使用entity framework 5和asp.net mvc4 codefirst。 我还使用可移植数据库文件(.mdf)

公共类项目
{
公共工程()
{
图像=新列表();
}
公共int ProjectId{get;set;}
[必需]
公共字符串标题{get;set;}
公共虚拟ICollection映像{get;set;}
公共字符串说明{get;set;}
公共项目类型类型{get;set;}
公共项目状态状态{get;set;}
}
公共枚举项目类型
{
电话,
网状物
窗户
}
公共枚举项目状态:字节
{
在进展中,
没有开始,
多恩
}
从视图发回模型后,所有字段都会正确保存到数据库中,枚举字段除外。它们会被保存,但即使在视图中选择了不同的值,也只会保存每个枚举类型的第一个值

我也尝试过保存编辑,同样的情况也发生了

我已经完成了create post方法的开头,在我的上下文中调用savechanges后,一切看起来都正常,但当我重定向回索引页时,它会将枚举属性值显示为枚举上的初始值(即第一个枚举值)

我的创建和编辑方法如下。希望这不是一个错误,但请帮助,因为我已经拉了我的头发与这两天。我只是从codefirst和Enum开始。谢谢

创建post方法

[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]
公共操作结果创建(项目,HttpPostedFileBase文件)
{
尝试
{
如果(file!=null&&file.ContentLength>0&&file.ContentType.Contains(“图像”))
{
//使用guid、文件名和项目标题创建新的唯一文件名
string relativePath=Constants.PortfolioImagesBaseFolder+
project.Title.Replace(“,”)+
Guid.NewGuid().ToString()+
GetFileName(file.FileName);
字符串absolutePath=Server.MapPath(relativePath);
//保存文件
file.SaveAs(绝对路径);
if(ModelState.IsValid)
{
project.Images.Add(新的projectmage())
{
IsProjectMainImage=true,
Url=相对路径,
Title=“主项目图像”
});
context.Projects.Add(项目);
SaveChanges();
返回操作(“索引”);
}
}
ViewBag.ProjectTypes=CreateSelectListFromEnumType();
ViewBag.ProjectState=CreateSelectListFromEnumType();
返回操作(“索引”);
}
编帖法

[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);
            }
[HttpPost]
公共操作结果编辑(int id,项目)
{
尝试
{
if(ModelState.IsValid)
{
//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=context.Entry(project.State);
context.Entry(project.State=EntityState.Modified;
SaveChanges();
返回操作(“索引”);
}
ViewBag.ProjectTypes=CreateSelectListFromEnumType();
ViewBag.ProjectState=CreateSelectListFromEnumType();
返回视图(项目);
}

同样在标记为重复之前,我已经查看了许多关于stackoverflow的答案,没有一个能帮助我,干杯,因此在提问之前等待了两天。

根据您的评论-由于您针对.NET Framework 4,enum属性没有被发现并添加到模型中,因为EF 4是.NET Framework 4的一部分不支持枚举,并且应用程序将无法在仅安装了.NET Framework 4(而不是.NET Framework 4.5,它是一个就地更新)的计算机上运行。出于相同的原因,安装在以.NET Framework 4为目标的项目中的EF5不允许使用EF5中可用的功能(枚举、地理空间类型、TVF等)当以.NET Framework 4.5为目标时。将项目重定目标为.NET Framework 4.5并重新安装EF5将使所有这些功能可用。

您是否检查了数据库中实际保存的内容?在我看来,枚举属性似乎没有在某个地方初始化,因此默认值正在保存。问题是发生这种情况的原因是您使用默认值保存,或者由于一个错误,您忽略了从数据库中读取的内容,并指定了稍后保存的默认值。我确实初始化了枚举值,正如我前面提到的那样,在代码中逐步显示它们是通过发布的表单值保存的,但奇怪的是枚举属性没有cor在codefirst创建的数据库中响应列。这是否正常?“奇怪的是,枚举属性在数据库中没有相应的列”这是您的问题。您是在.NET Framework 4还是.NET Framework 4.5上?还是您的目标是.NET Framework 4?谢谢@Pawel,似乎我是在针对.net4而不是4.5,这是您的问题不允许我使用最新的ve
[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);
            }