2015-02-09 6 views
1

У меня есть очень простые отношения, моя модель выглядит следующим образом:ManyToOne ограничения не работает

public class Project 
{ 
    [PrimaryKey, AutoIncrement] 
    public int ID { get; set; } 

    public string Name { get; set; } 

    [ForeignKey(typeof(User))] 
    public int ProjectManagerID { get; set; } 

    [ManyToOne] 
    public User ProjectManager { get; set; } 
} 

public class User 
{ 
    public string Login { get; set; } 

    [OneToMany] 
    public List<Project> Projects { get; set; } 
} 

Проблема заключается в том, что я могу сохранить проект Ис, с ссылкой на пользователь без сохранения пользователя, и я не получить исключение с ограничениями ограничений.

database.Insert(new Project 
    { 
     Name = "aaa", 
     ProjectManagerID = 8 
    }); 

Я могу даже запросить мой проект с недопустимым идентификатором пользователя, но у меня нет записи в таблице пользователя. Еще одна интересная вещь: я не могу хранить строку, подобную приведенной выше, в моем инструменте управления SQLite при открытии этой базы данных, поэтому я уверен, что моя схема базы данных в порядке.

Это нормально в sqlite-net PCL-библиотеке с расширениями sqlite-net?

UPDATE: Моя SQLite версия 3.8.7.4

ответ

3

Да, это нормально. SQLite-Net Extensions построена поверх SQLite-Net, которая не поддерживает ограничения внешнего ключа, поэтому на уровне базы данных нет внешнего ключа.

Использование основных методов SQLite-Net, свойство [ForeignKey] является просто целочисленным свойством, которое не имеет каких-либо ограничений, поэтому вы можете изменять его по своему усмотрению без ошибок времени выполнения.

Если вашему проекту требуются ограничения внешнего ключа на уровне базы данных, вы можете использовать метод Execute, чтобы добавить ограничения к столбцам, которые вы хотите вручную.

UPDATE:

Внешние ключи отключены по умолчанию в SQLite. Чтобы включить внешние ключи в SQLite-Net, вам необходимо добавить следующий код в начало вашей программы. Это утверждение не сохраняется в базе данных и должна выполняться каждый раз при запуске приложения:

database.Execute("PRAGMA foreign_keys = ON"); 

Чтобы проверить, что он включен, вы можете использовать PRAGMA foreign_keys:

int result = database.ExecuteScalar<int>("PRAGMA foreign_keys"); 
if (result == 1) { 
    // Foreign keys enabled 
} 

После того, как включен, вы можете добавить внешние ключи для ваших деклараций таблиц (sqlite doesn't support adding constraints on ALTER statements), как это:

CREATE TABLE child ( 
    id   INTEGER PRIMARY KEY, 
    parent_id INTEGER, 
    description TEXT, 
    FOREIGN KEY (parent_id) REFERENCES parent(id) 
); 

Очевидно создание таблиц вручную заставляет вас не будет e SQLite-Net CreateTable.

+0

Выполнено выполнение базы данных.Execute ("PRAGMA foreign_keys = ON"), но database.Execute ("PRAGMA foreign_keys") возвращает 0 – veeroo

+0

Фактическая база данных. Выполнение ("PRAGMA foreign_keys") генерирует исключение. Проблема все еще существует – veeroo

+0

Это звучит как другой вопрос. Отредактировал ответ, чтобы отразить его. – redent84

0

Проблема решена. Я забыл скопировать мою базу данных из папки «Ресурсы» (как шаблон) в папку данных приложения, так что технически моя база данных создавалась SQLite-Net без каких-либо внешних ключей. Благодарим за помощь

Смежные вопросы