2014-09-12 87 views
2

我使用EF(DB頭),並嘗試使用下一個代碼表中添加新行:如何使用EF獲取新行中所有必填字段的名稱?

var user = new User(); 

//Some logic to fill the properties 

context.Users.AddObject(user); 
context.SaveChanges(); 

節省EF變化之前,我想驗證所有必需的(不是null,沒有默認值價值)屬性被填充。我怎麼能得到所有這樣的領域?

我試過幾種方法,但無法達到所需的效果。最後一次嘗試是這樣的:

var resList = new List<PropertyInfo>(); 

var properties = type.GetProperties(BindingFlags.DeclaredOnly | 
           BindingFlags.Public | 
           BindingFlags.Instance).Where(p => !p.PropertyType.IsGenericType); 

foreach (var propertyInfo in properties) 
{ 
    var edmScalarProperty = 
     propertyInfo.CustomAttributes.FirstOrDefault(
      x => x.AttributeType == typeof (EdmScalarPropertyAttribute)); 
    var isNullable = true; 
    if (edmScalarProperty != null) 
    { 
     var arg = edmScalarProperty.NamedArguments.FirstOrDefault(x => x.MemberName == "IsNullable"); 
     if (arg != null) 
     { 
      isNullable = (bool) arg.TypedValue.Value; 
     } 
    } 

    if (!isNullable) 
    { 
     resList.Add(propertyInfo); 
    } 
} 

return resList; 
+1

Would'nt它更容易產生您的edmx文件中包含自定義.tt的不可空的無默認屬性列表?我沒有看到你如何從那裏獲得「默認值」的屬性(但我可能會錯過某些東西)。 – 2014-09-12 12:33:17

回答

2

創建一個構造函數,其中必填字段爲參數。

我總是將我的域對象與EF對象(DTO對象)分開。域對象只有一個構造函數和必需的字段。當我想保存這些對象時,我將它們轉換爲DTO對象。

+0

它與手動驗證每個必填字段沒有區別。我有近90個領域,其中約40個是必需的。這將是一個laaarge構造函數。 – LbISS 2014-09-19 05:29:01

+1

您有90個字段代表單個類別的數據嗎?難道它不能被重構爲更多的邏輯配對嗎? http://stackoverflow.com/questions/174968/how-many-parameters-are-too-many – Kritner 2014-09-19 19:36:29

+0

不幸的是,沒有。 – LbISS 2014-09-23 07:55:14

2

你看過所有關於DataAnnotations的模型類嗎?利用這些(並使用一個EF中的單獨對象爲您創建),您可以從模型級別獲得內置於模型中的非常有效的驗證。另外,正如L01NL指出的,你可以讓你的構造函數接受需要數據的參數。

大量的上模型和驗證信息可以發現,一個這樣的例子是: http://msdn.microsoft.com/en-us/library/dd410405(v=vs.100).aspx

(期待通過該主部和它的子段)

using System.ComponentModel.DataAnnotations 

public class Foo 
{ 
    public Guid Id { get; private set; } 

    [StringLength(50),Required] 
    public string FooName { get; private set; } 

    [Required] 
    public int Age { get; private set; } 

    // etc props 

    public Foo(string fooName, int age) 
    { 
     if (string.IsNullOrEmpty(fooName)) 
      throw new ArgumentException("FooName cannot be null or empty"); // note there is also a "minimum length" data annotation to avoid doing something like this, was just using this as an example. 

     this.Id = Guid.NewGuid(); 
     this.FooName = fooName; 
     this.Age = age; 
    } 
} 

public class YourController 
{ 

    [HttpPost] 
    public ActionResult Add(Foo foo) 
    { 
     if (!ModelState.IsValid) 
      // return - validation warnings, etc 

     // Add information to persistence 
     // return successful add? 
    } 

} 
相關問題