2011-06-07 32 views
1

讀取裏面我已經創建了一個標準的Windows控制檯應用程序內英鎊數據庫,然後我加入了該數據庫文件作爲WP7的應用程序內的資源。我發現數據庫讀取代碼在訪問LazyValue.Value成員時導致ArgumentNullException。英鎊數據庫不會WP7應用

這裏的數據庫創建代碼,但不包括模型「地點」。

public class TestDatabaseInstance : BaseDatabaseInstance 
{ 
    public override string Name 
    { 
     get 
     { 
      return "TestDatabase"; 
     } 
    } 

    protected override List<ITableDefinition> RegisterTables() 
    { 
     return new List<ITableDefinition> 
     { 
      CreateTableDefinition<Venue, int>(x=>x.VenueId) 
     }; 


    } 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     //CreateData(); 
     LoadData(); 

    } 

    private static void CreateData() 
    { 
     using (SterlingEngine engine = new SterlingEngine()) 
     { 
      engine.Activate(); 
      var databaseInstance = engine.SterlingDatabase.RegisterDatabase<TestDatabaseInstance>(); 
      for (int i = 100; i < 1000; i++) 
      { 
       var venue = new Venue(); 
       venue.Name = "test"; 
       venue.AddressLine1 = "this is an address"; 
       venue.VenueId = i; 
       var key = databaseInstance.Save<Venue>(venue); 
      } 

      FileStream fs = File.Open("c:\\myvenuedata.dat", FileMode.CreateNew, FileAccess.ReadWrite, FileShare.Write); 
      using (var binaryWriter = new BinaryWriter(fs)) 
      { 
       engine.SterlingDatabase.Backup<TestDatabaseInstance>(binaryWriter); 
      } 
      databaseInstance = null; 
     } 

    } 

    private static void LoadData() 
    { 
     SterlingEngine engine = new SterlingEngine(); 
     var fs = File.Open("c:\\myvenuedata.dat", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); 
     engine.Activate(); 
     var databaseInstance = engine.SterlingDatabase.RegisterDatabase<TestDatabaseInstance>(); 
     engine.SterlingDatabase.Restore<TestDatabaseInstance>(new BinaryReader(fs)); 
     engine.Dispose(); 
     engine = new SterlingEngine(); 
     engine.Activate(); 

     // THIS LINE WORKS FINE IN MY CONSOLE APP 
     databaseInstance.Query<Venue, int>().ForEach(x => Console.WriteLine(x.LazyValue.Value.Name)); 

    } 
} 

然後,如果我把等價代碼的WP7應用程序內:

SterlingEngine engine = new SterlingEngine(); 
     StreamResourceInfo sri = Application.GetResourceStream(new Uri("/SterlingDBReader;component/myvenuedata.dat", UriKind.RelativeOrAbsolute)); 
     var fs = sri.Stream; 
     engine.Activate(); 
     var databaseInstance = engine.SterlingDatabase.RegisterDatabase<TestDatabaseInstance>(); 
     engine.SterlingDatabase.Restore<TestDatabaseInstance>(new BinaryReader(fs)); 
     engine.Dispose(); 
     engine = new SterlingEngine(); 
     engine.Activate(); 

     // **Errors with ArgumentNullException here because x.LazyValue.Value IS NULL.** 
     databaseInstance.Query<Venue, int>().ForEach(x => Debug.WriteLine(x.LazyValue.Value.Name)); 

唯一的區別是

  • 讀者WP7應用程序的父命名空間是控制檯不同應用
  • 這是一個WP7應用程序從一個控制檯應用程序創建的數據文件中讀取
  • 它加載從獨立存儲中的數據文件作爲資源

任何想法? 感謝 克里斯

回答

1

當前,Sterling使用完全限定的裝配類型名稱存儲類型。這意味着被引用的類應該完全相同的項目=最好是共享的Silverlight 3 DLL。如果您只是鏈接文件並重新編譯,則無法正常工作。目標是在2.0版中改變這一點,以改善類型檢查,但目前情況就是如此。

+0

嗨,謝謝你的幫助。我無法創建Silverlight 3項目來創建該文件,因爲Sterling需要SL4。我無法使用Silverlight 4項目,因爲它與WP7不兼容。有任何想法嗎?! – krisdyson 2011-06-07 11:48:14

+0

哦,沒關係!我把*模型放在一個單獨的SL3組件中,它工作的很好!謝謝 – krisdyson 2011-06-07 11:57:30

0

據我所知,該類型是斯特林的存儲機制的重要組成部分,所以你需要確保存儲在數據庫中的類型的命名空間和類型名稱完全匹配。

我不知道,如果你的暗示scenarion是一個支持的,雖然恢復的辦法聽起來像它應該工作。我建議詢問CodePlex

鑑於你得到的例外,它聽起來就像是類型名稱可能無法正確匹配,因此LazyValue.Value被空。

+0

好的謝謝。 PS,改變命名空間,讓它們匹配不起作用。我將嘗試在Silverlight 3瀏覽器應用程序內創建數據庫文件,然後查看是否有效。基本上,我需要桌面的計算能力來首先創建文件。 – krisdyson 2011-06-07 10:19:23

+0

您可以在WP7內創建文件,然後使用獨立存儲資源管理器進行部署? – 2011-06-07 10:27:59

+0

幫助我創建文件的依賴關係之一不是Silverlight程序集。所以我被困在一塊岩石和一個堅硬的地方之間。這可能會奏效,但我想我需要提出一些其他解決方案。 – krisdyson 2011-06-07 10:39:36