如何将只读属性添加到数据库第一个实体框架6元数据

问题描述:

我正在学习自己的MVC和EF6,实际上我是在asp.net网站上的教程是非常有帮助的。今天我正在关注this tutorial。这是与代码优先的方法,但我用数据库第一的方法做到这一点。所以我按照说明将以下只读属性添加到模型中,在我的情况下添加到模型的元数据中。如何将只读属性添加到数据库第一个实体框架6元数据

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

,但是当我试图访问学生页面我得到这个错误:

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

我知道最近添加的属性有错误,所以我使用了它,但我找不到正确的解决方案。

你能告诉我怎么样,我应该提前将此属性添加到我的模型

感谢。

+1

你想要什么是为你的模型提供只读属性?如果这种情况下创建一个部分类,并添加此属性,并把[System.ComponentModel.DataAnnotations.Schema.NotMapped]属性 – Seminda 2014-09-05 00:28:55

+0

@Seminda的答案应该是接受的。 – balint 2015-02-16 17:56:09

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

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

    public partial class Student 
    { 
        public string FullName 
        {    
        get; 
        set; 
        } 
    } 
    
  2. 然后创建另一个叫学生部分类,并将其放置在同一组件(文件夹),但在不同的文件名不同的文件。 它会是这样的:

    [MetadataType(typeof(StudentMetadata))] 
    public partial class Student 
    { 
    } 
    
    public class StudentMetadata 
    { 
        [Display(Name = "Full Name")] 
        public string FullName { get; set; }   
    } 
    

然后如果你渲染视图

@model Models.Student 
@Html.DisplayForModel() 

属性的名称将显示你想要的方式你的EF模型Student类:

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

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

我不知道如何实现与Html相同的效果。EditorForModel

或者如果你还想属性全名由其他两个属性名字和姓氏的我想尝试:

  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() 
    

我不知道后者是在你的基础数据库架构的变化,那么你需要修改的情况下完美的方法你的孩子班。

+0

谢谢@sergik你的方法非常有用。另外,我尝试了另一种可能有用的方法。 (以下面的答案发布) – DigitalDNA 2014-09-05 16:06:59

正如我在@ sergik的回答中所评论的,我发现了另一种方法来获得这项工作(基于@ sergik的回答)。

  1. EF模型类


public class StudentMetadata 
{     

} 

  1. 声明一个局部类
  2. 
    
    [MetadataType(typeof(StudentMetadata))]  
        public partial class Student  
        {  
         [Display(Name = "Full Name")]  
         public string FullName  
         {  
          get  
          {  
          return LastName + ", " + FirstName;  
          }  
         }  
        } 
    
    
    1. 附加参考此类的数据注释
    2. 
      
          using System.ComponentModel.DataAnnotations; 
      
      
      1. 运行项目。这就是结果 Result addindg a read-only property to student class Database-First EF6

      这两个@Sergik和我的答案都经过测试,两者都很好。

      希望对其他人有用。

    开始=>
开始=>