创建DbContext时Xamarin.Forms iOS实体框架SQLite异常

时间:2019-07-05 07:09:38

标签: c# entity-framework sqlite xamarin.forms

在创建DbContext的实例时出现此异常:

  

System.ArgumentNullException:值不能为null。
  参数名称:键

我的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()){...}

发生错误。

找不到有关为什么会发生的任何信息。

p.s。我正在使用iOS模拟器。请给我一些建议...

谢谢。

1 个答案:

答案 0 :(得分:0)

这可能导致您忘记在模型类中设置primary key(缺陷,defMods,defDescr,FotoDefects)。

在属性中添加[Key]以使其成为相应表中的主键。

[JsonProperty("id")]
[Key]
public int Id { get; set; }
相关问题