从Windows控制台应用程序创建的Sterling数据库将无法在WP7应用程序内部读取

时间:2011-06-07 09:41:41

标签: c# database windows-phone-7

我在标准Windows控制台应用程序中创建了Sterling数据库,然后我将该数据库文件添加为WP7应用程序内的资源。我发现数据库读取代码在访问LazyValue.Value成员时导致ArgumentNullException。

这是数据库创建代码,不包括模型'Venue'。

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应用程序
  • 它将来自独立存储的数据文件作为资源加载

有什么想法吗? 谢谢 克里斯

2 个答案:

答案 0 :(得分:1)

目前,Sterling使用完全限定的程序集类型名称存储类型。这意味着引用的类应该在完全相同的项目中=最好是共享的Silverlight 3 DLL。如果您只是链接文件并重新编译它将无法正常工作。目标是在版本2.0中更改此项以改进类型检查,但现在就是这种情况。

答案 1 :(得分:0)

据我所知,类型是Sterling存储机制的重要组成部分,因此您需要确保存储在数据库中的类型的名称空间和类型名称完全匹配。 / p>

虽然恢复方法听起来应该有效,但我不知道你的建议是否是受支持的。我建议问CodePlex

鉴于您获得的异常,听起来类型名称可能无法正确匹配,因此LazyValue.Value为空。