2010-01-24 81 views
0

我正在开发一个利用db4o作为后端的电子商务网站。直到上周,我遇到了一个我一直无法解决的问题。下面的代码非常简单。我打开一个数据库文件,保存一个对象,然后尝试检索它。但我没有得到任何回报。 “用户”变量的计数为零。从db4o数据库加载对象

public class Program 
{ 
    private static string _connectionString = string.Format(@"c:\aaarrrr.db4o"); 

    static void Main(string[] args) 
    { 
     TestUser container = new TestUser() { id = 1, Name = "Mohammad", Surname = "Rafiq" }; 

     Db4oFactory.Configure().Diagnostic().AddListener(new DiagnosticToConsole()); 

     using (var dbc = Db4oFactory.OpenFile(_connectionString)) 
     { 
      dbc.Store(container); 
     } 

     IList<TestUser> users = null; 

     using (var dbc = Db4oFactory.OpenFile(_connectionString)) 
     { 
      users = dbc.Query<TestUser>(x => x.id == 1).ToList(); 
     } 

     if (users.Count > 0) 
     { 
      Console.WriteLine("{0} {1} with id of {2}", users.First().Name, users.First().Surname, users.First().id); 
     } 
     else 
     { 
      Console.WriteLine("\nNo data returned."); 
     } 

     Console.ReadLine(); 
    } 
} 

public class TestUser 
{ 
    [Indexed] 
    private int _id = 0; 
    private string _name = string.Empty; 
    private string _surname = string.Empty; 

    public int id { get { return _id; } set { _id = value; } } 
    public string Name { get { return _name; } set { _name = value; } } 
    public string Surname { get { return _surname; } set { _surname = value; } } 
} 

我附加了db4o诊断监听器,并且在控制台输出中我什么都看不到。一切似乎都很好。我知道我正在写文件,因为我可以看到文件大小增加,时间戳也被更新。我已经检查了所有的项目设置,它们都被设置为默认值。我正在使用.net 4,visual studio 2010测试版和windows 7.我已经做了一些关于反射许可的阅读,但我不知道这在这里如何适用。任何帮助或想法将knidly赞赏。

+0

更新。我创建了一个新的控制台应用程序项目,并将此代码复制并粘贴到该项目中。我跑了应用程序,我也惊讶它工作得很好。它必须与项目设置有关,或者可能是dll的项目引用。 – user257768 2010-01-24 11:47:56

+0

我已经在VS 2008和.NET 3.5上运行了代码。它在这里很好。 您是否在这两个项目中添加了“Db4objects.Db4o.NativeQueries.dll”程序集?当'Db4objects.Db4o.NativeQueries.dll'程序集存在时,上面的查询将被优化,否则不会。因此是相当不同的。 – Gamlor 2010-01-24 14:18:15

+0

我设法复制了这个问题。它与命名空间有关。如果将项目属性中的“程序集名称”和“默认命名空间”设置为简单名称(如“测试”),则代码将正常工作。但是,如果您将其设置为“Dukaan.Provider.db4o”,那么该代码不起作用。如果你能证实这一点会很好。谢谢。 P.S是我已经添加了这些程序集。 – user257768 2010-01-24 14:53:21

回答

0

调用store()之后,您需要在离开using {}语句之前提交()。您在提交更改之前关闭了数据库。