asp.net-mvc-4 - 为什么 viewmodel modelstate 验证实体的导航属性?

标签 asp.net-mvc-4 entity-framework-4 navigation-properties

我在 Controller 为实体 ARTICLE 创建操作期间遇到简单验证问题。我首先使用 EF 4 数据库。实体 ARTICLE 用作实体 ACTION(ACTION.ARTICLE_id) 中的外键。这就是为什么代码生成工具向实体 ARTICLE 添加导航属性,即使它没有多大意义。每次我更新实体时,类都会形成如下(文章)。我多次检查了所有外键。我真的不知道如何处理这个错误来制定干净的解决方案,而不仅仅是清除 Controller 操作中的错误。一切——甚至景观都被搭建起来。

行动:

    [HttpPost]
    [Authorize(Roles = "ARTICLE_ADMIN")]
    public ActionResult Edit(ARTICLE article)
    {
        if (ModelState.IsValid)
        {
            article.date_modified = DateTime.Now;

            string newimage = this.Request.Form["preview_image_filename"];
            string oldimage = this.Request.Form["original_image_filename"];

            if (newimage.NotNullOrEmpty())
            {
                article.preview_image = newimage;
            }
            else
            {
                article.preview_image = oldimage;
            }

            db.Entry(article).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        article.date_modified = DateTime.Now;

        ViewBag.ARTICLE_CATEGORY_id = new SelectList(db.ARTICLE_CATEGORY, "ARTICLE_CATEGORY_id", "description", article.ARTICLE_CATEGORY_id);
        ViewBag.ARTICLE_STATUS_id = new SelectList(db.ARTICLE_STATUS, "ARTICLE_STATUS_id", "description", article.ARTICLE_STATUS_id);
        ViewBag.WEB_USER_id = new SelectList(db.WEB_USER, "WEB_USER_id", "login", article.WEB_USER_id);
        return View(article);
    }

我正在使用通过代码生成工具生成的实体模型,并在元数据类中添加注释,它再简单不过了

public partial class ARTICLE
{
    public ARTICLE()
    {
        this.PROGRAM_WEEK_DAY_ITEM = new HashSet<PROGRAM_WEEK_DAY_ITEM>();
        this.STORAGE = new HashSet<STORAGE>();
        this.SHOW = new HashSet<SHOW>();
        this.ACTION = new HashSet<ACTION>();
    }

    public int ARTICLE_id { get; set; }
    public System.DateTime date_created { get; set; }
    public Nullable<System.DateTime> date_modified { get; set; }
    public string title { get; set; }
    public string html { get; set; }
    public int WEB_USER_id { get; set; }
    public int ARTICLE_STATUS_id { get; set; }
    public int ARTICLE_CATEGORY_id { get; set; }
    public Nullable<System.DateTime> date_published { get; set; }
    public string preview_image { get; set; }

    //code generation tool added those navigation props
    public virtual ARTICLE_CATEGORY ARTICLE_CATEGORY { get; set; }
    public virtual ARTICLE_STATUS ARTICLE_STATUS { get; set; }
    public virtual WEB_USER WEB_USER { get; set; }
    public virtual ICollection<PROGRAM_WEEK_DAY_ITEM> PROGRAM_WEEK_DAY_ITEM { get; set; }
    public virtual ICollection<STORAGE> STORAGE { get; set; }
    public virtual ICollection<SHOW> SHOW { get; set; }

    //this one causes trouble I think, but no clue why
    public virtual ICollection<ACTION> ACTION { get; set; }
}

元数据类 - 仅显示名称和格式:

public class ARTICLE_Metadata
{
    [Key]
    public int ARTICLE_id { get; set; }

    [Display(Name="Vytvořeno")]
    public System.DateTime date_created { get; set; }

    [Display(Name = "Změněno")]
    public Nullable<System.DateTime> date_modified { get; set; }

    [Display(Name = "Publikováno")]
    [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)]
    public Nullable<System.DateTime> date_published { get; set; }

    [Display(Name = "Titulek článku")]
    public string title { get; set; }

    [Display(Name = "Obsah článku")]
    [UIHint("tinymce_full"), AllowHtml]
    public string html { get; set; }

    [Display(Name = "Vytvořil")]
    public int WEB_USER_id { get; set; }

    [Display(Name = "Status")]
    public int ARTICLE_STATUS_id { get; set; }

    [Display(Name = "Kategorie")]
    public int ARTICLE_CATEGORY_id { get; set; }

    [Display(Name = "Náhledový obrázek")]
    public string preview_image { get; set; }
}

最后在 Razor View 中形成:

@using (Html.BeginForm("Create", "Articles", FormMethod.Post, new { @class = "base-form" }))
{
@Html.ValidationSummary(true)

<fieldset>
    <legend>Nový článek</legend>

    @Html.DatePickerFor(model => model.date_published, false)
    @Html.HiddenFor(model => model.WEB_USER_id)

    <p class="editor-label">
        @Html.LabelFor(model => model.ARTICLE_STATUS_id)
        @Html.DropDownList("ARTICLE_STATUS_id")
        @Html.ValidationMessageFor(model => model.ARTICLE_STATUS_id)
    </p>

    <p class="editor-label">
        @Html.LabelFor(model => model.ARTICLE_CATEGORY_id)
        @Html.DropDownList("ARTICLE_CATEGORY_id")
        @Html.ValidationMessageFor(model => model.ARTICLE_CATEGORY_id)
    </p>

    <p class="editor-label">
        @Html.LabelFor(model => model.title)
        @Html.EditorFor(model => model.title)
        @Html.ValidationMessageFor(model => model.title)
    </p>

    <div class="html-editor">
        @Html.EditorFor(model => model.html)
    </div>

    <p>
        <input type="submit" value="Vytvořit" class="submit" />
    </p>
</fieldset>
}

当模型验证并进入 Controller 操作时,ModelState.IsValid == false,ModelState 声明属性 ACTION 错误,该属性甚至不存在于表中,也不应该存在,它是导航属性。

错误有一个异常(exception):从类型“System.String”到类型“namespace.ACTION”的参数转换失败,因为没有类型转换器可以在这些类型之间进行转换。

我尝试附加调试器 View 图像,但该网站不允许我这样做。我还有通过 Controller 管理的其他实体,并以相同的方式查看 - 大约 30 个实体没有发生这种情况。

如何在不创建具有相同属性但没有导航属性的额外模型的情况下摆脱此问题?或者只是阻止此导航属性包含在验证中。或者这是一个新的微软废话功能?

最佳答案

有时,db-first 中的这些奇怪错误来自于实体中导航属性的名称与另一个实体的名称相同。我自己有时也遇到过这些问题,但我不知道到底是什么原因。

无论如何,重命名该导航属性一定能让您摆脱那个奇怪的错误......

关于asp.net-mvc-4 - 为什么 viewmodel modelstate 验证实体的导航属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17934342/

相关文章:

c# - Entity Framework - 包含的导航属性的选择条件

jquery - 如何在运行时将 Kendo Grid 与 System.Data.DataTable 绑定(bind)

entity-framework - 使用 EF 4.3 运行更新数据库时出错

c# - Entity Framework 嵌套导航属性仅计数

c# - 我应该在执行定期作业的单独线程中保留 DbContext 的实例吗

entity-framework-4 - 我可以将 .NET 集合中的列表对象与 EF 中的实体对象连接起来吗

c# - 使用 Include(string) 方法包含多个导航属性

c# - 首先使用 EF 5 数据库进行延迟加载

database - 使用多个数据库、共享资源和 EF 寻找 SaaS 的最佳方法

c# - MVC Razor 柱模型为空