2009-09-10 2 views
1

그래서 IT/개발자 티켓 목록을 Linq-To-SQL을 통해 데이터베이스에 저장했습니다. 저장 시도는 사용자 요청시 또는 저장시 종료라고 말하면 수행됩니다. 내 관심은 사용자가 중간에 저장하지 않고 둘 이상의 티켓을 변경한다는 것이 었습니다.트랜잭션을 사용하면 보조 dataContexts를 사용하여 sql 삽입/업데이트/삭제를 시도 할 필요가 없습니까?

데이터베이스가 변경 사항을 거부하는 경우 어떤 항목이나 어떤 필드의 티켓에 문제가 있는지에 대한 정보를 너무 많이 제공하지 않아 사용자에게 표시기를 제공 할 수 있도록 다시 묶을 수 있습니다 . 하나의 변경 사항이 대기열에 고정되어 이제 SubmitChanges가 더 이상 작동하지 않기 때문에 편집 한 레코드에 좋은 데이터를 저장할 수 없습니다.

  • 내가 만들 수 있습니다

    나는 변경은 티켓의 변경 SQL 개체에 LINQ, 대신 직접의 버퍼에 저장되도록 모든 티켓이 다른 클래스에 싸여됩니다 버퍼링 시스템을 구축 새로운 dataContext 인스턴스
  • 개별 행의 변경 내용을 저장하려고 시도합니다.
  • 그런 다음 실패한 각 사용자에게 다시보고합니다.

내가 추측하는 코드에는 상당히 냄새가 있으며, 아니면 적어도 추한 것입니다.

제 동료가 방금 거래를 제안했습니다. 나는 트랜잭션 방식을 테스트하기 위해 구축 한 것에 대한 철저한 분석을하지 않을 것입니다.

  • 트랜잭션이 항목이나 SaveChanges가 저장하려고 시도하는 모든 항목의 모든 변경 사항을 올바르게 재설정합니까? 이후에는 hasChanges가 비어 있고 SaveChanges는 아무 것도하지 않을 것으로 예상됩니다.
  • linq-to-sql에서 한 번에 개별 행 변경을 제출하는 더 좋은 방법이 있습니까?
  • SaveChanges 예외에서 누락 된 것이 있는데 실제로 어떤 행인지, 해당 행의 어떤 필드에 문제가 있는지 알 수 있습니까?

아마도 나는 (linq-to-sql 또는 실제 세계가 저장을 결정하지 않고 여러 단위를 변경하는 기능을 필요로하지 않기 때문에) 사용자가 티켓을 남길 때까지 허용해서는 안됩니다. 변경 사항을 저장할지 여부를 결정했습니다.

답변

0

나는 내 자신의 버퍼링 클래스를 굴려 보았다. 그것은 조금 지저분하지만 한 번에 하나의 레코드를 저장하는 데 효과적이다.

이것은 linq 엔티티를 랩핑하는 비즈니스 오브젝트의 상위 클래스입니다. 좀 더 내가 http://imaginarydevelopment.blogspot.com/2009/09/buffering-에서 사용되는 코드의 많은을 블로그에

#region assetTag 


    String _AssetTag; 
    public const String STR_assetTag = "assetTag"; 
    public String assetTag 
    { 
     get { return (Changes.ContainsKey(STR_assetTag) ? _AssetTag : Asset.assetTag); } 
     set 
     { 
      SetBufferedProperty<String>(STR_assetTag 
       ,() => Asset.assetTag = value, Asset.assetTag == value,() => _AssetTag = value); 
     } 
    } 
    #endregion 
+0

: 여기

public class BufferedLinqChange { LqGpsDataContext _dataContext; internal BufferedLinqChange(LqGpsDataContext dataContext) { _dataContext = dataContext; } protected void SetBufferedProperty<T>(string key,Action linqAction ,bool linqEqualsValue,Action bufferAction) { if (linqEqualsValue) { if (Changes.ContainsKey(key)) Changes.Remove(key); } else Changes.InsertOrUpdate(key, linqAction); bufferAction(); } protected Dictionary<String, Action> Changes = new Dictionary<string, Action>(); public int ChangeCount { get { return Changes != null ? Changes.Count : 0; } } public bool hasChanges { get { return Changes != null ? Changes.Count > 0 : false; } } public void SubmitChanges() { _dataContext.SubmitChanges(); if (ChangeCount > 0) { Changes.ForEach((item) => item.Value.Invoke()); _dataContext.SubmitChanges(); } } public void CancelChanges() { if (Changes != null) Changes.Clear(); } } 

는 속성 중 하나의 샘플입니다 linq-changes-for-row-at-time.html – Maslow

관련 문제