2014-09-05 57 views
0

我正在學習自己的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

回答

1

如果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

0

正如我在@ sergik的回答中所評論的,我發現了另一種方法來獲得這項工作(基於@ sergik的回答)。

  1. EF模型類


public class StudentMetadata 
{     

} 

  • 聲明一個局部類
  • 
    
    [MetadataType(typeof(StudentMetadata))]  
        public partial class Student  
        {  
         [Display(Name = "Full Name")]  
         public string FullName  
         {  
          get  
          {  
          return LastName + ", " + FirstName;  
          }  
         }  
        } 
    
    
  • 附加參考此類的數據註釋
  • 
    
        using System.ComponentModel.DataAnnotations; 
    
    
    1. 運行項目。這就是結果 Result addindg a read-only property to student class Database-First EF6

    這兩個@Sergik和我的答案都經過測試,兩者都很好。

    希望對其他人有用。

    相關問題