2011-02-13 3 views
1

아마도 업데이트 할 수있는 속성을 사용할 수있는 메서드를 만들고 싶고 손길이없는 사용자는 그대로 둡니다.Entity Framework 4.0의 테이블 필드 업데이트에 대한 일반적인 해결책

public static void updateTable(int id, string field1, string field2, string field3){ 
    using(var context = new Entities()){ 
     var obj = context.Table.Where(x=>x.id == id).FirstOrDefault(); 
     if(obj != null){ 
      obj.field1 = field1; 
      ... 

      obj.SaveChanges(); 
     } 
    } 
} 

그러나이 패턴에서, 난 그냥 하나의 필드를 업데이트 할 방법으로 4 개 매개 변수를 전달해야합니다 여기

은 내가 한 것입니다. 전달 된 필드 만 업데이트하는 일반 솔루션이 있습니까?

나는 이런 식으로 뭔가를 내놓았다 :

public static void updateTable(int id, object data_json){ 
    using(var context = new Entities()){ 
     var obj = context.Table.Where(x=>x.id == id).FirstOrDefault(); 
     if(obj != null){ 
      if(data_json['field1']!=null) //something like this 
       obj.field1 = data_json['field1']; 
      ... 

      obj.SaveChanges(); 
     } 
    } 
} 

을하지만 내가 널이 될 수있는 필드를 설정하고자 할 경우를 처리 할 수 ​​없습니다. 아니면 더 좋은 해결책이 있습니까? 당신이 관계 업데이트에 대한 상관하지 않는 경우

답변

0

, 당신은 단지 스칼라 속성을 업데이트 ApplyCurrentValues를 사용할 수 있습니다.

예컨대 :

public static void updateTable(int id, object data_json){ 
    using(var context = new Entities()) { 
     var obj = context.Table.Where(x=>x.id == id).FirstOrDefault(); 
     context.ApplyCurrentValues("Table", data_json); 
    } 
} 

는 동일한 키 엔티티 가정 이미 그래프에 부착된다. 이 경우 var obj에 대한 쿼리는 개체가 그래프에 있는지 확인한 다음 제공된 개체의 스칼라 속성으로 내용이 재정의됩니다.

엔티티 집합에 포함 된 것과 동일한 유형인지 확인하려면 data_json에 대한 명시 적 형변환이 필요할 수 있습니다.

+0

3 개의 가능한 스칼라 속성 중 1 개만 설정하면 'ApplyCurrentValues'는 다른 2 개의 속성을'null '로 설정합니다. 'ApplyCurrentValues'는 설정 한 값만 업데이트하고 변경되지 않은 속성은 그대로 두는 방법이 있습니까? –

0

ExpandoObject을 사용하면 설정하려는 속성 만 보낼 수 있으며 null 값도 지정할 수 있습니다. 예를 들어

:

public static void updateTable(int id, dynamic data){ 
    using(var context = new Entities()){ 
     var obj = context.Table.Where(x=>x.id == id).FirstOrDefault(); 
     if(obj != null){ 
      if (((IDictionary<string, object>)data).ContainsKey("field1")) 
       obj.field1 = data.field1; 
      ... 

      obj.SaveChanges(); 
     } 
    } 
} 

당신이처럼 호출 할 수 있습니다

dynamic data = new ExpandoObject(); 

data.field1 = 123; 
data.field2 = null; 
data.field5 = "abc"; 

MyClass.updateTable(1, data); 
0

모든 것은 반성의 순간에 해결 될 수있다. 이 기능은 문제를 해결 :

public void UpdateTable(int id, object values) 
    { 
     using (var entities = new MyEntities()) 
     { 
      var valuesType = values.GetType(); 
      var element = entities.MyTable.Where(t => t.ID == id).First(); 

      //We are iterating through all properties of updated element and checking 
      //if there is value provided for there properties in values parameter 
      foreach (var property in element.GetType().GetProperties()) 
      { 
       var valuesProperty = valuesType.GetProperty(property.Name); 
       //If values contain this property 
       if (valuesProperty != null) 
       { 
        //taking value out of values parameter 
        var value = valuesProperty.GetValue(values, null); 
        //setting it in our element to update 
        property.SetValue(element, value, null); 
       } 
      } 

      entities.SaveChanges(); 
     } 
    } 

사용 : 심지어 일반 테이블 형식 매개 변수를 추가하여이 방법이 더 보편적 할 수

UpdateTable(125, new { FieldA = 1, FieldB = "ABCD" }); 

.

관련 문제