2014-03-26 37 views
0

我有Windows Phone 8本地数据库的问题。这是我的数据库代码的样子:DuplicateKeyException和SqlCeException SQL Ce WP8

[Table(Name = "Folders")] 
    public class FolderTable : INotifyPropertyChanged, INotifyPropertyChanging, IEqualityComparer<FolderTable> 
    { 
     private string _folderName; 
     private string _description; 
     private string _password; 
     private string _tileColorName; 

     [Column(IsPrimaryKey = true)] 
     public string FolderName 
     { 
      get { return _folderName; } 
      set 
      { 
       if (_folderName != value) 
       { 
        NotifyPropertyChanging(); 
        _folderName = value; 
        NotifyPropertyChanged(); 
       } 
      } 
     } 

     [Column(CanBeNull = false)] 
     public string Description 
     { 
      get { return _description; } 
      set 
      { 
       if (_description != value) 
       { 
        NotifyPropertyChanging(); 
        _description = value; 
        NotifyPropertyChanged(); 
       } 
      } 
     } 

     [Column] 
     public string Password 
     { 
      get { return _password; } 
      set 
      { 
       if (_password != value) 
       { 
        NotifyPropertyChanging(); 
        _password = value; 
        NotifyPropertyChanged(); 
       } 
      } 
     } 

     [Column] 
     public string TileColorName 
     { 
      get { return _tileColorName; } 
      set 
      { 
       if (_tileColorName != value) 
       { 
        NotifyPropertyChanging(); 
        _tileColorName = value; 
        NotifyPropertyChanged(); 
       } 
      } 
     } 

     private void NotifyPropertyChanging([CallerMemberName] string propertyName = "") 
     { 
      if (PropertyChanging != null) 
       PropertyChanging(this, new PropertyChangingEventArgs(propertyName)); 
     } 

     private void NotifyPropertyChanged([CallerMemberName] string propertyName = "") 
     { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 


     public event PropertyChangedEventHandler PropertyChanged; 
     public event PropertyChangingEventHandler PropertyChanging; 


     public bool Equals(FolderTable x, FolderTable y) 
     { 
      return x.FolderName == y.FolderName; 
     } 

     public int GetHashCode(FolderTable obj) 
     { 
      return obj.FolderName.GetHashCode(); 
     } 
    } 

添加文件夹:

public Task Add(Folder folder) 
    { 
     var folderTable = GetFolderTable(folder); 

     _databaseContext.Folders.InsertOnSubmit(folderTable); 

     return Task.FromResult(true); 
    } 

提交:

public Task Commit() 
{ 
    try 
    { 
     _databaseContext.Folders.Context.SubmitChanges(); 
    } 
    catch (DuplicateKeyException duplicateKeyException) 
    { 
     _databaseContext.Dispose(); 
     _databaseContext = new FolderDbContext(FolderDbContext.DBConnectionString); 

     throw new FolderAlreadyExistsException(duplicateKeyException); 
    } 

    return Task.FromResult(true); 
} 

当我Add新的文件夹(与该名称的文件夹之前并不存在), Commit然后我尝试添加具有相同名称的文件夹DuplicateKeyException被引发并正确处理。但是,在捕获部分中重新创建上下文后,下一个对具有相同名称的添加和提交文件夹的调用会抛出​​,并显示消息:"A duplicate value cannot be inserted into a unique index. [ Table name = Folders,Constraint name = PK_Folders ]"。这是正常的行为还是我做错了什么? DuplicateKeyException在什么情况下被抛出?如何捕捉​​?我甚至无法看到System.Data.SqlServerCe命名空间。

回答

1

使用反射来获取前任主器件接收的类型名称,如果你想赶上明确的SqlCeException:

ex.GetType().Name == "SqlCeException"