C# 如何向数据库first Entity Framework 6元数据添加只读属性

C# 如何向数据库first Entity Framework 6元数据添加只读属性,c#,asp.net,asp.net-mvc,entity-framework-6,C#,Asp.net,Asp.net Mvc,Entity Framework 6,我正在自学MVC和EF6,实际上我正在学习asp.net网站上的教程,这些教程非常有用。今天我跟在后面。这是使用代码优先的方法,但我使用数据库优先的方法。因此,我按照说明将以下只读属性添加到模型中,在我的例子中,添加到模型的元数据中 [Display(Name = "Full Name")] public string FullName { get { return LastName + ", " + FirstMidName; } } 但

我正在自学MVC和EF6,实际上我正在学习asp.net网站上的教程,这些教程非常有用。今天我跟在后面。这是使用代码优先的方法,但我使用数据库优先的方法。因此,我按照说明将以下只读属性添加到模型中,在我的例子中,添加到模型的元数据中

[Display(Name = "Full Name")]
public string FullName
{
      get
      {
         return LastName + ", " + FirstMidName;
      }
}
但当我尝试访问学生页面时,我出现了以下错误:

System.ComponentModel.DataAnnotations.dll中发生“System.InvalidOperationException”类型的异常,但未在用户代码中处理。其他信息:“MVCEF6DBFirst.Models.Student”类型的关联元数据类型包含以下未知属性或字段:FullName。确保这些成员的名称与主类型属性的名称匹配

我知道最近添加的属性有一个错误,所以我在谷歌上搜索了它,但我找不到正确的解决方案

您能告诉我如何将此属性添加到我的模型中吗


提前感谢。

如果数据库表中不存在FullName列,这意味着EF model Student类中不存在属性FullName,则会出现此错误

  • 我怀疑您能否使用元数据方法实现您想要的。但可以修改在视图中渲染属性的方式。如果以下是您的EF模型类:

    public partial class Student
    {   
      public string FullName 
      {             
        get;
        set;
      }
    }
    
    public partial class Student
    {
     public string FirstName
     {
         get; set;
     }
    
     public string SecondName
     {
        get; set;
     }
    
  • 然后创建另一个名为Student的分部类,并将其放在同一程序集(文件夹)中,但放在具有不同文件名的不同文件中。 看起来是这样的:

    [MetadataType(typeof(StudentMetadata))]
    public partial class Student
    {
    }
    
    public class StudentMetadata
    {
        [Display(Name = "Full Name")]
        public string FullName { get; set; }          
    } 
    
  • 然后,如果在视图中渲染EF模型学生类

    @model Models.Student
    @Html.DisplayForModel()
    
    属性的名称将按您想要的方式显示:

    如果要通过将字段设置为只读来阻止用户编辑该字段,则可能需要使用此选项

     @Html.TextBoxFor(m => m.FullName, new{ disabled = "disabled", @readonly = "readonly" })
    
    我不知道如何使用Html.EditorForModel实现同样的效果

    或者,如果您仍然需要由其他两个属性FirstName和LastName组成的属性FullName,我会尝试:

  • 您的EF模型类:

    public partial class Student
    {   
      public string FullName 
      {             
        get;
        set;
      }
    }
    
    public partial class Student
    {
     public string FirstName
     {
         get; set;
     }
    
     public string SecondName
     {
        get; set;
     }
    
    }

  • 班级扩展学生班级:

    public class StudentChild : Student
    {
    
    [Display(Name="User name")]
    public String FullName
    {
        get { return FirstName + ", " + SecondName; }
    }
    
    }

  • 那么在你看来,

    @model StudentChild
    
    @Html.DisplayForModel()
    

  • 我不确定后者是否是完美的方法,因为如果基础数据库模式发生更改,则需要修改子类。

    正如我在@sergik的答案中所评论的那样,我找到了另一种方法来完成这项工作(基于@sergik的答案)

  • EF模型类
  • 声明一个分部类
  • 将DataAnnotations引用添加到此类
  • 运行项目。这就是结果
  • @Sergik和我的答案都经过了测试,效果都很好


    希望对其他人有用。

    您想要的是为您的模型提供只读属性?如果出现这种情况,则创建一个分部类并添加此属性并放置[System.ComponentModel.DataAnnotations.Schema.NotMapped]attribute@Seminda的答案应该是可以接受的。谢谢@sergik您的方法非常有用。此外,我尝试了另一种可能有用的方法。(以下为答案)
    
    
        using System.ComponentModel.DataAnnotations;