Xamarin.Forms iOS Entity Framework SQLite исключение при создании DbContext - PullRequest
0 голосов
/ 05 июля 2019

Я получаю это исключение при создании экземпляра DbContext:

System.ArgumentNullException: значение не может быть нулевым.
Имя параметра: ключ

Мой DbContext файл:

public sealed class DefectContext : DbContext
{
    //private string _dbPath { get; set; }

    public DbSet<defects> i_defect { get; set; }
    public DbSet<defMods> i_def_mod { get; set; }
    public DbSet<defDescr> i_def_descr { get; set; }
    public DbSet<FotoDefects> i_foto_def { get; set; }

    public DefectContext()
    {
        Database.EnsureCreated();
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var dbPath = DependencyService.Get<IPath>().GetDatabasePath(App.DatabaseName);
        optionsBuilder.UseSqlite($"Filename={dbPath}");
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // Для i_defect
        // Определение составного первичного ключа
        modelBuilder.Entity<defects>().HasKey(p => new { p.c_isso, p.n_def });
        // Определение Nullable полей
        modelBuilder.Entity<defects>().Property(p => p.n_constr).IsRequired(false);
        modelBuilder.Entity<defects>().Property(p => p.b).IsRequired(false);
        modelBuilder.Entity<defects>().Property(p => p.b1).IsRequired(false);
        modelBuilder.Entity<defects>().Property(p => p.d).IsRequired(false);
        modelBuilder.Entity<defects>().Property(p => p.d1).IsRequired(false);
        modelBuilder.Entity<defects>().Property(p => p.r).IsRequired(false);
        modelBuilder.Entity<defects>().Property(p => p.r1).IsRequired(false);
        modelBuilder.Entity<defects>().Property(p => p.g).HasDefaultValue(false);
        modelBuilder.Entity<defects>().Property(p => p.g1).HasDefaultValue(false);
        modelBuilder.Entity<defects>().Property(p => p.datef).IsRequired(false);

        // Для i_def_mod
        modelBuilder.Entity<defMods>().HasKey(p => new {p.c_isso, p.n_def, p.date});
        modelBuilder.Entity<defMods>().Property(p => p.l_def).IsRequired(false);
        modelBuilder.Entity<defMods>().Property(p => p.w_def).IsRequired(false);
        modelBuilder.Entity<defMods>().Property(p => p.c_rem).IsRequired(false);
        modelBuilder.Entity<defMods>().Property(p => p.v_rem).IsRequired(false);

        // Для i_def_descr
        modelBuilder.Entity<defDescr>().HasKey(p => new {p.c_isso, p.n_def, p.date, p.c_defparam});
        modelBuilder.Entity<defDescr>().Property(p => p.value).IsRequired(false);
        modelBuilder.Entity<defDescr>().Property(p => p.b1).IsRequired(false);
        modelBuilder.Entity<defDescr>().Property(p => p.d).IsRequired(false);
        modelBuilder.Entity<defDescr>().Property(p => p.d1).IsRequired(false);
        modelBuilder.Entity<defDescr>().Property(p => p.r).IsRequired(false);
        modelBuilder.Entity<defDescr>().Property(p => p.r1).IsRequired(false);
        modelBuilder.Entity<defDescr>().Property(p => p.g).HasDefaultValue(false);
        modelBuilder.Entity<defDescr>().Property(p => p.g1).HasDefaultValue(false);

        // Для i_foto_def
        modelBuilder.Entity<FotoDefects>().HasKey(p => new {p.c_isso, p.n_def, date = (DateTime) p.date});
        modelBuilder.Entity<FotoDefects>().Property(p => p.foto).IsRequired(false);

        var dateTimeConverter = new ValueConverter<DateTime, long>(
            // В БД
            v => new DateTimeOffset(v).ToUnixTimeMilliseconds(),
            // Из БД
            v => DateTimeOffset.FromUnixTimeMilliseconds(v).DateTime
        );
        var byteArrayConverter = new ValueConverter<byte[], string>(
            // В БД
            v => Convert.ToBase64String(v),
            // Из БД
            v => Convert.FromBase64String(v)
            );

        // Определение конвертации поля в БД
        modelBuilder.Entity<defects>().Property(p => p.date)
            .HasConversion(dateTimeConverter);
        modelBuilder.Entity<defMods>().Property(p => p.date)
            .HasConversion(dateTimeConverter);
        modelBuilder.Entity<defDescr>().Property(p => p.date)
            .HasConversion(dateTimeConverter);
        modelBuilder.Entity<FotoDefects>().Property(p => p.date)
            .HasConversion(dateTimeConverter);
        modelBuilder.Entity<FotoDefects>().Property(p => p.foto)
            .HasConversion(byteArrayConverter);
    }
}

Получить файл кода пути базы данных:

public class IosDbPath : IPath
{
    public string GetDatabasePath(string filename)
    {
        return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "..", "Library", filename);
    }
}

И когда я перейду к этой строке кода:

using (var sqliteRepository = new DefectContext()){...}

ошибка.

Не могу найти информацию о том, почему это могло произойти.

ps Я работаю с симулятором iOS.Пожалуйста, дайте мне совет ...

Заранее спасибо.

1 Ответ

0 голосов
/ 05 июля 2019

Возможно, это вызвано тем, что вы забыли установить primary key в классе модели (дефекты, defMods, defDescr, FotoDefects).

Добавьте [Ключ] к свойству, которое квалифицирует его как первичный ключ в соответствующей таблице.

Как

[JsonProperty("id")]
[Key]
public int Id { get; set; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...