我已經建立了一個數據驅動模型,將我的表拖到edml的空設計器上。我知道我可以在我的模型周圍建立一個數據環境,並且可以像訪問類一樣訪問每個表,但每個模型的代碼在哪裏?EDML生成模型的代碼在哪裏?
我問,因爲我想添加驗證到每個屬性的類的setter本身。
我已經建立了一個數據驅動模型,將我的表拖到edml的空設計器上。我知道我可以在我的模型周圍建立一個數據環境,並且可以像訪問類一樣訪問每個表,但每個模型的代碼在哪裏?EDML生成模型的代碼在哪裏?
我問,因爲我想添加驗證到每個屬性的類的setter本身。
在項目的根級查找.dbml
文件。在該文件下,您將看到一個名爲<someDB>.designer.cs
的文件。但是,(你也可以在設計器文件的頂部看到這個),你並不想對這個文件中的類做任何改變。
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
如果你想添加,你應該考慮創建Partial
類,擴展生成的類的功能。
這裏是我創建來處理我的驗證的樣本部分類:你的部分類必須在你在你designer.cs
文件的頂部看到同一個命名空間中定義
namespace ETL_Framework_UI
{
[MetadataType(typeof(DataObjectMD))]
public partial class DATA_OBJECT:IValidatableObject
{
public class DataObjectMD
{
[Required(ErrorMessage="The object name is required")]
[StringLength(50, ErrorMessage = "Name cannot exceed 50 characters")]
public string OBJECT_NAME { get; set; }
}
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
ETLDbDataContext db = new ETLDbDataContext();
var field = new[] { "OBJECT_NAME" };
var param = db.DATA_OBJECTs.SingleOrDefault(r => r.OBJECT_NAME == OBJECT_NAME && r.OBJECT_ID != OBJECT_ID);
if (param != null)
{
yield return new ValidationResult("Object name is already in use. ", field);
}
注意。
你不想自己編輯自動生成的類,如果你需要再次生成它們,這將導致巨大的問題。你想用DataAnnotations來代替部分類。這樣您的驗證/額外規則將永遠分開,並且更易於維護。
謝謝很多鏈接。我不知道存在這樣的事情,現在我知道在他的例子中,Rondel(上面)所說的一些代碼。 – 2012-02-07 22:04:42
如果你要添加驗證也許實體框架代碼首先是一個更好的解決方案。
你能解釋一下爲什麼嗎?我總是想知道爲什麼我應該選擇實體而不是sql。我知道ltos對於sql server環境更好。 – 2012-02-07 21:50:04
我很想知道爲什麼。我不知道任何經常使用的驗證系統與EF一樣不適用於L2S。 – 2012-02-07 21:55:29
不需要部分類。你擁有一個地方。更多關於EF代碼的優點http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx – 2012-02-07 22:17:26
這將是我第一次使用分部類。那裏有一些代碼,我從來沒有見過! – 2012-02-07 21:47:04
這裏有一些非常酷的東西。查看右側的這些PluralSight視頻:http://www.asp.net/mvc。它有關於驗證和其他MVC概念的一些很棒的教程 – Rondel 2012-02-07 21:58:25
感謝您的鏈接。這是我第一次看到「收益率」被使用。這是什麼意思!? – 2012-02-07 22:02:52