База данных Sterling, созданная из приложения Windows Console, не будет считываться внутри приложения WP7 - PullRequest
1 голос
/ 07 июня 2011

Я создал базу данных Sterling в стандартном консольном приложении Windows, затем добавил этот файл базы данных в качестве ресурса в приложение WP7. Я обнаружил, что код чтения базы данных вызывает исключение ArgumentNullException при доступе к члену LazyValue.Value.

Вот код создания базы данных, исключая модель «Место проведения».

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 из файла данных, созданного консольным приложением
  • Загружает файл данных из изолированного хранилища как ресурс

Есть идеи? Спасибо Kris

Ответы [ 2 ]

1 голос
/ 07 июня 2011

В настоящее время Sterling хранит типы, используя полное имя типа сборки. Это означает, что ссылочные классы должны быть в одном и том же проекте = предпочтительно совместно используемая библиотека Silverlight 3. Если вы просто связываете файлы и перекомпилируете их, это не сработает. Цель состоит в том, чтобы изменить это в версии 2.0, чтобы улучшить проверку типов, но сейчас это так.

0 голосов
/ 07 июня 2011

Насколько мне известно, тип является важной частью механизма хранения для Sterling, поэтому вам необходимо убедиться, что пространства имен и имена типов, которые хранятся в базе данных, точно совпадают.

Я понятия не имею, является ли сценарий, который вы предлагаете, поддерживаемым, хотя подход восстановления выглядит так, как будто он должен работать. Я бы порекомендовал спросить на CodePlex .

Принимая во внимание исключение, которое вы получаете, похоже, что имена типов могут не совпадать должным образом, поэтому LazyValue.Value имеет значение null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...