代码之家  ›  专栏  ›  技术社区  ›  Sascha

MVC元数据数据注释混乱

  •  1
  • Sascha  · 技术社区  · 6 年前

    我尝试使用元数据类,以便在重新生成模型类时能够保留验证属性。然而,在建议中,我不断遇到问题。

    更新或重新生成模型类时,它会创建/更新 DatabaseModel.edmx > DatabaseModel.tt 自动生成的 tablename.cs

    根据 Microsoft 文档,我创建了 Metadata.cs Partial.cs 模型文件夹中的类,甚至尝试使用以下示例代码为每个数据库表创建类:

    using System;
    using System.ComponentModel.DataAnnotations;
    
    namespace CApp.Models
    {
    
        [MetadataType(typeof(ConsultantMetaData))]
        public partial class Consultant
        {
        }
        public class ConsultantMetaData
        {
            [Required]
            [Display(Name = "Name")]
            public string ConsultantName { get; set; }
    
            [Required]
            [EmailAddress]
            [Display(Name = "Email")]
            public string ConsultantEmail { get; set; }
    
            [Required]
            [Display(Name = "Is Active")]
            public bool IsActive { get; set; }
        }
    }
    

    这是我开始得到模糊错误的时候。

    “Consultant”是“CApp.Data.Consultant”之间的模糊引用

    创建默认索引、详细信息、创建、编辑和删除控制器以及后续视图的默认支架是受影响的支架。默认情况下,这些都使用自动生成的模型类代码来获取和设置数据。

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include ="ConsultantId,ConsultantName,ConsultantEmail,IsActive")] Consultant consultant)
    {
        if (ModelState.IsValid)
        {
            db.Consultants.Add(consultant);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
    
        return View(consultant);
    }
    

    // GET: Consultants/Edit/5
    public ActionResult Edit(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Consultant consultant = db.Consultants.Find(id);
        if (consultant == null)
        {
            return HttpNotFound();
        }
        return View(consultant);
    }
    

    我将得到隐式转换错误:

    'CApp.模型.顾问'

    在方法中,如果我将顾问更改为:

    CApp.Data.Consultant consultant = db.Consultants.Find(id);
    

    然后按常规获取数据,忽略Display validation属性,仍然显示表列名,而不是所需的Display name属性。

    假设包含所需数据注释的元数据类需要与自动生成的模型完全匹配表中的列,或者我只需要指定需要自定义显示名称或其他自定义属性的自定义列,这样的假设是否正确?

    1 回复  |  直到 6 年前
        1
  •  1
  •   roozbeh S    6 年前

    当您试图在CApp.Models命名空间中添加元数据时,似乎在CApp.Data namesmapce下有一个顾问类!

    您应该考虑使用相同的名称空间。您需要将CApp.Models更改为CApp.Data(或者其他方式,但我不推荐)。

    你对顾问的最初定义应该是:

    namespace CApp.Data
    {
        public partial class Consultant
        {
            // some codes
        }
    }
    

    注意,类的原始定义必须是 部分

    using System;
    using System.ComponentModel.DataAnnotations;
    
    namespace CApp.Data
    {
    
        [MetadataType(typeof(ConsultantMetaData))]
        public partial class Consultant
        {
        }
        public class ConsultantMetaData
        {
            [Required]
            [Display(Name = "Name")]
            public string ConsultantName { get; set; }
    
            [Required]
            [EmailAddress]
            [Display(Name = "Email")]
            public string ConsultantEmail { get; set; }
    
            [Required]
            [Display(Name = "Is Active")]
            public bool IsActive { get; set; }
        }
    }