Entity Framework SQLite Foreign Keys работает на сохранение, но не чтение - PullRequest
0 голосов
/ 25 мая 2018

У меня есть приложение xamarin с EF Core 2.0.1, и у меня странная проблема с внешними ключами, которые не работают должным образом в моей базе данных SQLite.

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

Что я здесь не так делаю?

Моя модель с ключом

    /// <summary>
    /// The id of the form template
    /// </summary>
    public int TemplateId { get; set; }

    /// <summary>
    /// Link to the template
    /// </summary>
    [ForeignKey("TemplateId")]
    public virtual FormTemplate FormTemplate { get; set; }

Сопоставленная модель

    /// <summary>
    /// Identifier for the form template.
    /// This comes from the API.
    /// </summary>
    [Key]
    public int Id { get; set; }

Мой инициализатор контекста данных

    /// <summary>
    /// Constructor
    /// </summary>
    public DatabaseContext(string databaseFilePath)
    {
        DatabaseFilePath = databaseFilePath;
        Database.EnsureCreated(); // Use this in testing so that we don't have to make migrations on every db change
        Database.ExecuteSqlCommand("PRAGMA foreign_keys = ON");
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlite($"Filename={DatabaseFilePath}");
    }

- это схема SQL, созданная при просмотре БД

CREATE TABLE `FormsMessages` (
    `Id`    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    `TemplateId`    INTEGER NOT NULL,
    CONSTRAINT `FK_FormsMessages_FormTemplates_TemplateId` FOREIGN KEY(`TemplateId`) REFERENCES `FormTemplates`(`Id`) ON DELETE CASCADE
);

pragma sql db

Похоже, что BD SQL имеет ограничение из модели EF.Тем не менее, когда я пытаюсь просмотреть свойство навигации, FormTemplate всегда равно null, даже если я сохраню его с FormTemplate = myinstance.(Кстати, проводник базы данных показывает, что templateId заполняется, когда я делаю это.)

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