간체, 개체에 대한 테이블 두 개 (Items
및 Properties
)를 매핑하는 Entity Framework가 있습니다. 각 항목에는 특정 속성 (일대 다)이 있습니다.관련 엔터티 추가, 제거 및 업데이트
내 프로그램 외부에서, 새 항목 또는 기존 항목의 업데이트 인 속성이있는 속성이있는 "죽은"항목이 속성을 통해 수신됩니다. 이 데이터는 WCF 호출, 웹 양식 POST, 비 직렬화에서 가져온 것일 수 있습니다. 요점은 내가받은 링크가 해제 된 데이터로 데이터베이스의 항목과 속성을 삽입 및 업데이트하려는 것입니다.
다양한 related questions 및 answers (이 중 일부는 even compile이 아님)이 발견되었습니다. 문제는 내가 기존 항목 및 수신, 업데이트 항목의 속성을 동기화하는 코드의 부하를 작성해야한다 :
당신이 볼private static void UpdateProperties(Item existingItem, Item updatedItem, TestdatabaseEntities context)
{
// Find deleted properties
foreach (var existingProp in existingItem.Properties.ToList()) // ToList() to work on a local copy, otherwise you'll be removing items from an enumeration
{
var inUpdate = updatedItem.Properties.Where(p => p.Name == existingProp.Name).FirstOrDefault();
if (inUpdate == null)
{
// Property with this Name was not found as property in the updated item, delete it
context.Properties.DeleteObject(existingProp);
}
}
// Find added or updated properties
foreach (var updatedProp in updatedItem.Properties)
{
var inDatabase = existingItem.Properties.Where(p => p.ItemID == existingItem.ID && p.Name == updatedProp.Name).FirstOrDefault();
if (inDatabase == null)
{
// Added
inDatabase = new Property { Name = updatedProp.Name };
existingItem.Properties.Add(inDatabase);
}
// Updated (& added), map properties (could be done with something like AutoMapper)
inDatabase.Value = updatedProp.Value;
// etc...
}
context.SaveChanges();
}
, 객체의 특정 속성 (existingItem.Properties
, p.Name == existingProp.Name
에 대한 다양한 참조가, p.ItemID == existingItem.ID
),이 방법의 좀 더 일반적인 버전을 만들 수 있으며 약간의 재귀 (심지어는 Property
그 자체가 다른 엔티티에 대한 참조를 가진다면 어떨까요?
그러나 궁금한 점은 :이 프로세스 (전체 프로세스 또는 일부)를보다 쉽게 수행 할 수 있습니까? 아니요, 보존하려는 엔티티에 다른 데이터가 있으므로 항목에서 모든 속성을 삭제하고 업데이트시 다시 추가 할 수 없습니다.
당신이 묘사 한 문제는 객체 매핑 운동처럼 들립니다. 내가 당신을 올바르게 이해했다면 http://automapper.org/이 도움이 될 것입니다. – Robert
@Robert 매핑은 문제가 아닙니다 ('inDatabase.Value' 행 위의 주석 참조). 단 첨부 된 항목을 첨부 된 항목과 비교하고 필요할 경우보다 우아한 방법으로 표시하는 방법 – CodeCaster
나는 누군가의 명백하게 틀린 대답에 동의하지 않을 때 때때로이 질문이 무작위로 어떻게 내려가는지를 좋아하고 주석에서 그렇게 설명하려고 노력한다. 계속해서 그 2 포인트 공제는 매번 다치게됩니다. – CodeCaster