C# 从Windows控制台应用程序创建的Sterling数据库赢得';不要在WP7应用程序中阅读
我在一个标准的Windows控制台应用程序中创建了一个Sterling数据库,然后将该数据库文件作为资源添加到WP7应用程序中。我发现数据库读取代码在访问LazyValue.Value成员时导致ArgumentNullException 这是数据库创建代码,不包括“场馆”模型C# 从Windows控制台应用程序创建的Sterling数据库赢得';不要在WP7应用程序中阅读,c#,database,windows-phone-7,C#,Database,Windows Phone 7,我在一个标准的Windows控制台应用程序中创建了一个Sterling数据库,然后将该数据库文件作为资源添加到WP7应用程序中。我发现数据库读取代码在访问LazyValue.Value成员时导致ArgumentNullException 这是数据库创建代码,不包括“场馆”模型 public class TestDatabaseInstance : BaseDatabaseInstance { public override string Name { get
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));
}
}
公共类TestDatabaseInstance:BaseDatabaseInstance
{
公共重写字符串名
{
得到
{
返回“TestDatabase”;
}
}
受保护的覆盖列表注册表项()
{
返回新列表
{
CreateTableDefinition(x=>x.VenueId)
};
}
}
班级计划
{
静态void Main(字符串[]参数)
{
//CreateData();
LoadData();
}
私有静态void CreateData()
{
使用(SterlingEngine=new SterlingEngine())
{
引擎。激活();
var databaseInstance=engine.SterlingDatabase.RegisterDatabase();
对于(int i=100;i<1000;i++)
{
var场馆=新场馆();
地点:Name=“测试”;
vitune.AddressLine1=“这是一个地址”;
VenueId=i;
var key=databaseInstance.Save(地点);
}
FileStream fs=File.Open(“c:\\myvenuedata.dat”,FileMode.CreateNew,FileAccess.ReadWrite,FileShare.Write);
使用(var binaryWriter=newbinarywriter(fs))
{
engine.SterlingDatabase.Backup(binaryWriter);
}
databaseInstance=null;
}
}
私有静态void LoadData()
{
斯特林发动机=新的斯特林发动机();
var fs=File.Open(“c:\\myvenuedata.dat”,FileMode.Open,FileAccess.ReadWrite,FileShare.ReadWrite);
引擎。激活();
var databaseInstance=engine.SterlingDatabase.RegisterDatabase();
Restore(新的二进制读取器(fs));
引擎。Dispose();
发动机=新斯特林发动机();
引擎。激活();
//这行代码在我的控制台应用程序中运行良好
databaseInstance.Query().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));
SterlingEngine引擎=新的SterlingEngine();
StreamResourceInfo sri=Application.GetResourceStream(新Uri(“/SterlingDBReader;component/myvenuedata.dat”,UriKind.RelativeOrAbsolute));
var fs=sri.Stream;
引擎。激活();
var databaseInstance=engine.SterlingDatabase.RegisterDatabase();
Restore(新的二进制读取器(fs));
引擎。Dispose();
发动机=新斯特林发动机();
引擎。激活();
//**此处存在ArgumentNullException错误,因为x.LazyValue.Value为NULL**
databaseInstance.Query().ForEach(x=>Debug.WriteLine(x.LazyValue.Value.Name));
唯一的区别是
- 阅读器WP7应用程序的父命名空间与控制台应用程序不同
- 它是从控制台应用程序创建的数据文件读取的WP7应用程序
- 它将数据文件作为资源从独立存储中加载
Kris据我所知,类型是Sterling存储机制的重要组成部分,因此您需要确保存储在数据库中的类型的名称空间和类型名称完全匹配 我不知道您建议的场景是否受支持,尽管恢复方法听起来应该可行。我建议你继续问下去
考虑到您遇到的异常,听起来类型名称可能不匹配,因此LazyValue.Value为null。据我所知,类型是Sterling存储机制的重要组成部分,因此,您需要确保存储在数据库中的类型的名称空间和类型名称完全匹配 我不知道您建议的场景是否受支持,尽管恢复方法听起来应该可行。我建议你继续问下去
如果出现异常,听起来类型名称可能不匹配,因此LazyValue.Value为null。当前Sterling使用完全限定的程序集类型名称存储类型。这意味着引用的类应该在完全相同的项目中=最好是共享的Silverlight 3 DLL。如果您只是链接文件并重新编译,它将无法正常工作。我们的目标是在2.0版中对此进行更改,以改进类型检查,但目前情况就是这样。目前Sterling使用完全限定的程序集类型名存储类型。这意味着引用的类应该在完全相同的项目中=最好是共享的Silverlight 3 DLL。如果您只是链接文件并重新编译,它将无法正常工作。我们的目标是在2.0版中对此进行更改,以改进类型检查,但目前情况就是这样。好的,谢谢。PS,更改名称空间使其匹配不起作用。我将尝试在Silverlight 3浏览器应用程序中创建db文件,然后看看是否有效。基本上,我首先需要桌面的计算能力来创建文件。您能在WP7中创建文件,然后使用独立存储资源管理器将其向下拉以进行部署吗?帮助我创建文件的一个依赖项不是Silverlight程序集。所以我被困在岩石和坚硬的地方之间。那可能行,但我想我需要想出一些其他的解决方案。好的,谢谢。PS,更改名称空间使其匹配不起作用。我将尝试在Silverlight 3浏览器应用程序中创建db文件,然后看看是否有效。基本上,我首先需要桌面的计算能力来创建文件。你能在WP7和t中创建文件吗