2011-02-18 2 views
0

CTP5에 대한 추가 또는 업데이트 패턴이 필요합니다. 모델을 가정 :CTP5 업데이트 캐스케이드

public class User 
{ 
    public int UserId { get; set; } 
    public ICollection<Address> Addresses { get; set; } 
} 
public class Address 
{ 
    public int AddressID { get; set; } 
    public string Location { get; set; } 
} 

을 나는 새로운 사용자를 추가하는 경우 풀어서 주소 테이블도 채워집니다. 그러나 사용자가 이미 DB에 있다면 DbUpdateException이 발생합니다. 이 경우 데이터베이스의 데이터를 새 데이터로 업데이트하려고합니다. 어떻게해야합니까? 데이터베이스에

데이터

표 주소

AddressID 위치

1 JohnPlace

2 MaryPlace

3 JimmyPlace

[사용자 I 업데이트는 주소 수집에있다 AddressId : 2, Location = GeorgePlace가있는 항목 1 개. 그러나 ID = 2 인 경우 Db에는 이미 location = MarryPlace가있는 레코드가 있습니다. GeorgePlace가 MarryPlace를 덮어 쓰길 원합니다.

var user=new User(); 
user.Id=GetUserIDfromService(); 
foreach(var address in GetAddressesFromService(user.Id)){ 
    user.Addresses.Add(address); 
} 
context.Users.Add(user); 
context.SaveChanges();//this may throw an exception, because there is already a user with this id. 
+0

@Ryan : 당신이 데이터베이스에 주소를 가질 수 있습니다 그래서 모든 사용자에게 할당되지 않는 이유는 무엇입니까? 또한 업데이트 코드를 게시 할 수 있습니까? –

+0

나는 Jakub Konecki가 제안한 것과 같은 것을 해낸다. 하지만 context.Users.Add (newUser)와 같은 것을 할 수 있기를 바란다. context.SaveChanges() – Ryan

+0

@ Ryan : 코드를 게시하십시오. 업데이트하려는 사용자 및 주소 개체뿐만 아니라 실제 업데이트 방법을 어떻게 받았거나 만들 었는지 알아야합니다. –

답변

0

당신이 그것을 삽입하지 않는 기존 사용자를 업데이트 할 경우 (Add()를 호출하지 않는 : 사용자처럼

나는

내가 만든 사용자에게 할당되지 않은 주소를 가질 수 없습니다) 먼저 ID로 사용자를로드하고 등록 정보를 수정 한 후 컨텍스트에서 SaveChanges()을 호출하십시오.

var db = new DatabaseContext(); 
var user = db.Users.Find(myUserId); 
user.Name = "New Name"; 
db.SaveChanges(); 
+0

에서 데이터를 가져옵니다. 그러나 이것은 사용자에게도 각 주소에 대해 동일한 작업을 수행해야합니다. 일부 주소는 새 주소이므로 추가해야합니다. 일부 주소는 업데이트가 필요합니다. – Ryan

0

현재 문제는 새 사용자 개체를 준비한다는 것입니다 그 주소를 채 웁니다 상황이 그들을 알고하지 않도록 주소가 같은 컨텍스트를 통해 DB에서로드되지 않습니다. Add 메서드를 호출하면 개체 그래프의 모든 개체를 가져 와서 새로 삽입 된 개체로 표시합니다. 이 문제를 방지하는 유일한 방법은 수동으로 사용자가 인스턴스를 추가하기 전에 어떤 주소가 새 것인지, 수정인지 또는 컨텍스트의 주소를로드 하는지를 수동으로 말합니다.

처럼 보일 수있는 주소를 표시하는 코드 :

var user = new User(); 
user.Id = GetUserIDfromService(); 
context.Users.Add(user); 
foreach(var address in GetAddressesFromService(user.Id)) 
{ 
    context.Addresses.Attach(address); 
    // Let say that new address always have 0 Id  
    context.Entry(address).State = address.Id == 0 ? EntityState.Added : EntityState.Modified;  
    user.Addresses.Add(address); 
} 

context.SaveChanges(); 
+0

ID가 이미 추가되었을 수 있습니다. 불행히도 새 주소가 0이라고 가정 할 수 없습니다. 내 솔루션은 DbUpdateException을 catch하는 것보다 새로운 것으로 User를 추가하려고 시도하는 것이고 catch 블록에서는 수정 된 것으로 추가합니다. 어떻게 생각해? – Ryan

+0

@ Ryan : 이것과 비슷한 문제인 것처럼 보입니다 : http : // stackoverflow.com/questions/5024094/how-can-i-ignore-a-dbupdateconcurrencyexception-with-my-entity-framework-code 필자는 이러한 솔루션을 개인적으로 반대하고있다. 귀하의 신청서에서 일어나고 있습니다. 그것은 일반적으로 작동하지만 하나씩 실패를 처리 할 것이므로 수정할 20 개의 주소에 대해 예외를 20 번 잡아야한다고 예상합니다. –

+0

다른 방법을 구현할 것을 어떻게 제안합니까? – Ryan