Проблема при попытке создать базу данных для приложения Windows Phone - PullRequest
1 голос
/ 04 сентября 2011

Я пытаюсь создать простую базу данных для использования sqlce в приложении Windows Phone. У меня есть базовый класс и другой набор классов, которые происходят от него Вот что я получил

public abstract class EntityBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string property)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(property));
            }
        }

        private int id;

        [Column(IsPrimaryKey = true, IsDbGenerated = true, DbType = "INT NOT NULL Identity", CanBeNull = false, AutoSync = AutoSync.OnInsert)]
        public int EntityId
        {
            get
            {
                return id;
            }
            set
            {
                if (id != value)
                {
                    id = value;
                    OnPropertyChanged("Id");
                }
            }
        }
    }

    [Table]
    public class Derived : EntityBase 
    {
        [Column]
        public string Description
        {
            get;
            set;
        }
    }

Тогда у меня есть этот класс для целей datacontext:

public class MyDataContext : DataContext
    {
        // Specify the connection string as a static, used in main page and app.xaml.
        public static string DBConnectionString = "Data Source=isostore:/ToDo.sdf";

        // Pass the connection string to the base class.
        public MyDataContext(string connectionString)
            : base(connectionString)
        { }

        public Table<Derived> Deriveds;
    }

И, наконец, здесь я пытаюсь создать БД:

private void Application_Launching(object sender, LaunchingEventArgs e)
        {
            using (MyDataContext db = new MyDataContext(MyDataContext.DBConnectionString))
            {
                if (db.DatabaseExists() == false)
                {
                    //Create the database -> here's the error
                    db.CreateDatabase();
                }
            }
        }

Я получаю следующую ошибку при попытке создать базу данных:

Неверный идентификатор столбца. [EntityId]

Да, очень описательное сообщение об ошибке ... Есть идеи, что не так? Я возился с атрибутами в столбце, но безрезультатно.

[EDIT]: для того, что я тестировал, если я помещаю свойство EntityId в производный класс, оно не вылетает. Это может быть 2 вещи .. одно, что я пропускаю что-то еще в базовом классе, или другое, что атрибут столбца для первичного ключа должен принадлежать классу и не может принадлежать родителю (который было бы крайне ужасным дизайнерским решением, мы не можем использовать наследование ???). если кто-то может подтвердить это, то будет признателен

1 Ответ

3 голосов
/ 04 сентября 2011

Хорошо, я думаю, что нашел, что происходит.В этой реализации SQLCe нам нужно использовать следующий подход при использовании наследования:

http://msdn.microsoft.com/en-us/library/bb399352(v=VS.100).aspx

Мне это не особо нравится, генерируемые им таблицы не являютсянормализовано, но это правда, что мы не должны использовать огромные и сложные хранилища данных для приложений WP7, это скорее хранить некоторую базовую информацию, которую слишком много для обработки изолированным хранилищем, на себя. Следуя этому подходу, это сработало.Теперь у меня есть коллекция базового класса, и я могу вставить в нее любого из его дочерних классов.Затем, чтобы получить их обратно, я использую дискриминатор в запросе linq to sql, чтобы получить тот или иной производный класс.

...