2010-02-24 2 views
0

저는 LINQ를 배우고 있으며 한 번에 삽입하고 업데이트하는 데 문제가 있습니다. 나는 School이 기본 키인 StatusReport 테이블 (School, Customer, Time)과 School이 외래 키이고 School + ServiceName이 기본 키인 Service 테이블 (School, ServiceName, State 및 Version)을 가지고있다. . PRIMARY KEY 제약 조건 'PK_dbo.Service'의 위반 : - 나는 SQL 예외를 얻을Linq-SQL + 자식 관계로 업데이트/삽입하는 데 문제가 있습니다.

public MockReport(int numDrives, int numServers, int numCameras, string customer, string school) 
{ 
    _school = school; 
    string c = "..."; 
    using (DataClasses1DataContext _context = new DataClasses1DataContext(c)) 
    { 
     _context.CommandTimeout = 60; 
     Random random = new Random(); 

     bool inserting = false; 
     _report = _context.StatusReports.SingleOrDefault(s => s.School == school); 
     if (_report == null) 
     { 
      _report = new StatusReport(); 
      inserting = true; 
     } 


     updateService("System Monitor", "Running", "1.0.0.0"); 


     _report.Customer = customer; 
     _report.School = school; 
     _report.Time = DateTime.Now; 

     if (inserting) 
     { 
      _context.StatusReports.InsertOnSubmit(_report); 
     } 

     _context.SubmitChanges(); 
    } 
} 

private void updateService(string serviceName, string state, string version) 
{ 
    Service service = _report.Services.SingleOrDefault(s => s.School == _school && s.ServiceName == serviceName); // returns null! 
    bool inserting = false; 
    if(service == null) 
    { 
     service = new Service(); 
     inserting = true; 
    } 
    service.ServiceName = serviceName; 
    service.State = state; 
    service.Version = version; 
    if(inserting) 
    { 
     _report.Services.Add(service); 
    } 
} 

삽입은 괜찮지 만 업데이트가 실패

여기 내 업데이트 코드입니다. 'dbo.Service'개체에 중복 키를 삽입 할 수 없습니다. 명세서가 종료되었습니다.

또한 서비스 서비스 = _report.Services.SingleOrDefault (s => s.School == _school & & s.ServiceName == serviceName); 데이터가 있어도 null을 반환합니다.

아이디어가 있으십니까?

답변

-1

기본 키 제한 오류는 새 값을 삽입하려는 테이블의 어딘가에 중복 값이 ​​있음을 알려줍니다. 따라서 새로운 가치는 이미 존재하는 가치의 복제물이 될 것입니다.

해당 사항이 아닌지 확인하십시오. 두 번째 오류에

: Service 객체 인 경우, 나는

당신은 서비스 객체를 생성해야합니다 ... 당신의 SingleOrDefault 방법은 당신을 위해 그 객체를 만들 것을 알고 다음 원하는 데이터를 찾을 수 없습니다 데이터베이스에서 업데이트하고, Service 개체에 고정시키고, 개체를 업데이트하고 데이터베이스에 커밋합니다.

+0

나는 SingleOrDefault()가 데이터베이스에서 객체를 검색한다고 생각했습니다. 그런 다음 해당 객체를 변경하고 SubmitChanges()를 호출하여 해당 객체에 대한 변경 사항을 커밋합니다. –

+0

SingleOrDefault는 컬렉션에서 하나의 항목을 가져오고 컬렉션이 null이면 null을 반환합니다. –

+0

SingleOrDefault는 항상 null 컬렉션에서 예외를 throw합니다. 오버로드 SingleOrDefault (Func <>)는 Func <>이 true를 반환하면 컬렉션에서 단일 항목을 검색하고 해당 항목이없는 경우 null을 반환합니다. –

관련 문제