2011-11-16 3 views
1

Silverlight 클라이언트와 내 DomainService간에 느슨하게 결합 된 모델을 사용하고 있습니다. EF와 함께 POCO를 사용 중입니다.상속 된 DbContext를 사용할 때 변경 내용이 저장되지 않습니다.

툴링이 제공하는 스캐 폴딩을 사용하지 않습니다. 나는 다음이 업데이트 방법

public partial class MyDomainService : DbDomainService<MyContext> 
{ 
... 
} 

:로

DomainService 클래스는 선언

public UpdatePerson(PersonInfo source) 
{ 
    var person = DbContext.People.Find(source.Id); 
    person.Name = source.Name; 
    DbContext.SaveChanges(); 
} 

하지만 수동으로 변경 저장되지 않습니다 데이터베이스를 검사 할 때. 내가 같이 할 수있는 코드를 수정하지만 경우 --- 모두 괜찮 : 나는 내 자신의 로컬 컨텍스트 변수를 만드는 상관없는 가정

public UpdatePerson(PersonInfo source) 
{ 
    using(var context = GetDbContext()) 
    { 
     var person = context.People.Find(source.Id); 
     person.Name = source.Name; 
     context.SaveChanges(); 
    } 
} 

,하지만 내부적으로 무슨 일이 일어나고 있는지 궁금 그 첫 번째 방법은 효과가 없습니다.

답변

1

DomainService가 작동하도록 설계된 방법을 사용하지 않으므로 몇 가지 이상한 일을 할 수 있습니다. DbContext.SaveChanges는 코드에서 호출하지 않기 때문에 Changeset의 모든 CUD 메서드가 처리 된 후 PersistChangeset 메서드의 DomainService에서 호출됩니다.

DomainService가 보유한 DbContext에는 몇 가지 속성이 변경되었습니다. ProxyCreationEnabled, ValidateOnSaveEnabled, AutoDetectChangesEnabled 및 LazyLoadingEnabled는 모두 false로 설정됩니다. 귀하의 경우, AutoDetectChangesEnabled가 false로 설정되어 있기 때문에 person.Name을 변경하면 DbContext가 person.Name에 대한 변경 사항이 있음을 알 수 없습니다.

+0

감사합니다. 나는 DbDomainservice를 "작동하도록 설계된"방식으로 사용할 때 모든 눈을 감 으려고합니다.하지만 제한이 있습니다. 데이터베이스에서 UI 로의 실제 엔티티 간소화를 실제로 수행 할 수는 없습니다. 이것이 제가이 접근법을 채택한 이유입니다. 나는 더 큰 두통에 빠지기 쉽다 "시스템을 버킹"? –

+0

예, 여전히 문제가있을 수 있습니다. 내가 줄 수있는 가장 좋은 대답은 http://blogs.msdn.com/b/kylemc/archive/2011/08/18/unit-testing-a-wcf-ria-domainservice에서 Kyle McClellan의 Unit Testing 시리즈를 살펴 보는 것입니다. -part-1-the-idomainservicefactory.aspx 그는 IRepository를 사용하는 방법을 보여줍니다. DomainService를 올바르게 사용하고 IRepository 뒤에있는 귀하의 limirations를 숨기면 나는 당신이 더 나은 경험을 할 수 있다고 생각합니다. –

+0

@ColinBlair DomainService는 invoke 메서드에서 작동하도록 어떻게 설계 되었습니까? 그것들은 진부한 논리의 일부가 아니며 이후에 어떤 형태의 제출 (컨텍스트 또는 어쩌면 DomainService에서)을 호출하지 않으면 컨텍스트가 저장되지 않습니다. – John

관련 문제