【问题标题】:How to Add a read-only Property to Database first Entity Framework 6 metadata如何将只读属性添加到数据库第一个实体框架 6 元数据
【发布时间】:2014-09-06 00:25:15
【问题描述】:

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

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

但是当我尝试访问学生页面时,我收到了这个错误:

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

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

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

提前致谢。

【问题讨论】:

  • 您想要为您的模型提供只读属性吗?如果是这种情况,请创建一个部分类并添加此属性并放入 [System.ComponentModel.DataAnnotations.Schema.NotMapped] 属性
  • @Seminda 的答案应该是被接受的。

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


【解决方案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; }          
    } 
    

如果你在视图中渲染你的 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()
    

我不确定后者是否是完美的方法,因为如果您的基础数据库架构发生更改,那么您需要修改您的子类。

【讨论】:

  • 感谢@sergik,您的方法非常有用。此外,我尝试了另一种可能有用的方法。 (发布为下面的答案)
【解决方案2】:

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

  1. EF 模型类


public class StudentMetadata
{                

}

  1. 声明部分类


[MetadataType(typeof(StudentMetadata))]    
    public partial class Student    
    {    
       [Display(Name = "Full Name")]    
       public string FullName    
       {    
          get    
          {    
             return LastName + ", " + FirstName;    
          }    
       }    
    }

  1. 向此类添加 DataAnnotations 引用


    using System.ComponentModel.DataAnnotations;

  1. 运行项目。这是结果

@Sergik 和我的答案都经过了测试,并且都运行良好。

希望对其他人有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    相关资源
    最近更新 更多