如何向数据库第一个Entity Framework 6元数据添加只读属性

时间:2014-09-05 00:15:57

标签: c# asp.net asp.net-mvc entity-framework-6

我自己学习MVC和EF6,实际上我按照asp.net网站上的教程非常有帮助。今天我跟着this tutorial。这是使用代码优先的方法,但我使用数据库第一种方法。所以我按照说明将以下只读属性添加到模型中,在我的例子中添加到模型的元数据中。

[Display(Name = "Full Name")]
public string FullName
{
      get
      {
         return LastName + ", " + FirstMidName;
      }
}

但是当我尝试访问学生页面时出现此错误:

类型' System.InvalidOperationException'的例外情况发生在System.ComponentModel.DataAnnotations.dll中但未在用户代码中处理。附加信息:类型' MVCEF6DBFirst.Models.Student'的关联元数据类型。包含以下未知属性或字段:FullName。确保这些成员的名称与主要类型的属性名称匹配。

我知道最近添加的属性存在错误,因此我使用Google搜索但我无法找到正确的解决方案。

你能告诉我应该如何将这个属性添加到我的模型中

提前感谢。

2 个答案:

答案 0 :(得分:1)

如果数据库表中不存在FullName列,这意味着您的EF模型Student类中不存在属性FullName,您将收到此错误。

  1. 我怀疑你能用元数据方法实现你想要的东西。但您可以修改属性在视图中的呈现方式。如果以下是您的EF模型类:

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

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

    @model Models.Student
    @Html.DisplayForModel()
    

    该属性的名称将以您希望的方式显示:

    如果您想阻止用户通过只读它来编辑字段,您可能想要使用此

     @Html.TextBoxFor(m => m.FullName, new{ disabled = "disabled", @readonly = "readonly" })
    

    我不确定如何使用Html.EditorForModel

    实现相同的效果

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

    1. 您的EF模型类:

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

      }

    2. 课程扩展学生班级:

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

      }

    3. 然后在您看来:

      @model StudentChild
      
      @Html.DisplayForModel()
      
    4. 我不确定后者是否是完美的方法,因为您的基础数据库架构发生了变化,那么您需要修改子类。

答案 1 :(得分:0)

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

  1. EF Model Class
  2. 
    
    public class StudentMetadata
    {                
    
    }
    
    
    1. 声明部分课程
    2. 
      
      [MetadataType(typeof(StudentMetadata))]    
          public partial class Student    
          {    
             [Display(Name = "Full Name")]    
             public string FullName    
             {    
                get    
                {    
                   return LastName + ", " + FirstName;    
                }    
             }    
          }
      
      
      1. 将DataAnnotations引用添加到此类
      2. 
        
            using System.ComponentModel.DataAnnotations;
        
        
        1. 运行项目。这是结果 Result addindg a read-only property to student class Database-First EF6
        2. @ Sergik和我的答案都经过了测试,两者都运行良好。

          希望对其他人有用。