Using xamarin with EF core gives SQLite Error

0

The models are Member Has Many Players (One to Many RelationShip) Player Has many Sports Sports Has many players PlayerSports for Many to Many relationship between Player and sport

public class Member
{
    public int MemberId { get; set; }
    public string Code { get; set; }
    public double Payment { get; set; }
    public virtual List<Player> Players { get; set; }
}

public class Player
{
    public int PlayerId { get; set; }
    public string Name { get; set; }
    public double Payment { get; set; }
    public virtual ICollection<PlayerSport> PlayerSports { get; set; }
    public int MemberId { get; set; }
    public virtual Member Member { get; set; }
}

public class Sport
{
    public int SportId { get; set; }
    public string Name { get; set; }
    public string Type { get; set; }
    public double Price { get; set; }
    public virtual ICollection<PlayerSport> PlayerSports { get; set; }
}

public class PlayerSport
{
    public int PlayerId { get; set; }
    public int SportId { get; set; }
    public virtual Player Player { get; set; }
    public virtual Sport Sport { get; set; }
}

When The member is deleted delete children players without deleting the sports When player is deleted the parent member and sports still the same

    public class AppContext : DbContext
    {
        public DbSet<Member> Members { get; set; }
        public DbSet<Player> Players { get; set; }
        public DbSet<Sport> Sports { get; set; }
        public DbSet<PlayerSport> PlayersSports { get; set; }

    public AppContext()
    {
        SQLitePCL.Batteries_V2.Init();

        this.Database.EnsureCreated();
    }
    
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Member>()
            .HasMany<Player>(m => m.Players)
            .WithOne(p => p.Member)
            .HasForeignKey(p => p.MemberId)
            .OnDelete(DeleteBehavior.Cascade);

        modelBuilder.Entity<PlayerSport>()
            .HasKey(t => new { t.PlayerId, t.SportId });

        modelBuilder.Entity<PlayerSport>()
        .HasOne(ps => ps.Player)
        .WithMany(p => p.PlayerSports)
        .HasForeignKey(ps => ps.PlayerId);

        modelBuilder.Entity<PlayerSport>()
            .HasOne(ps => ps.Sport)
            .WithMany(s => s.PlayerSports)
            .HasForeignKey(ps => ps.SportId);
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        string dbPath = Path.Combine(FileSystem.AppDataDirectory, "members.db3");

        optionsBuilder
            .UseSqlite($"Filename={dbPath}");
    }
}

When i save the entries and call SaveChangesAsync I get error

Inner exception: Microsoft.Data.Sqlite.SqliteException (0x80004005): SQLite Error 19: 'FOREIGN KEY constraint failed'.

The FullError:

Inner exception: Microsoft.Data.Sqlite.SqliteException (0x80004005): SQLite Error 19: 'FOREIGN KEY constraint failed'. at Microsoft.Data.Sqlite.SqliteException.ThrowExceptionForRC (System.Int32 rc, SQLitePCL.sqlite3 db) [0x0006d] in :0 at Microsoft.Data.Sqlite.SqliteDataReader.NextResult () [0x0017b] in :0 at Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader (System.Data.CommandBehavior behavior) [0x000d4] in :0 at Microsoft.Data.Sqlite.SqliteCommand.ExecuteReaderAsync (System.Data.CommandBehavior behavior, System.Threading.CancellationToken cancellationToken) [0x00007] in :0 at Microsoft.Data.Sqlite.SqliteCommand.ExecuteDbDataReaderAsync (System.Data.CommandBehavior behavior, System.Threading.CancellationToken cancellationToken) [0x00011] in :0 at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync (Microsoft.EntityFrameworkCore.Storage.RelationalCommandParameterObject parameterObject, System.Threading.CancellationToken cancellationToken) [0x00278] in <908a85714c18433696ab2103bcabebcc>:0 at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync (Microsoft.EntityFrameworkCore.Storage.RelationalCommandParameterObject parameterObject, System.Threading.CancellationToken cancellationToken) [0x004c9] in <908a85714c18433696ab2103bcabebcc>:0 at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync (Microsoft.EntityFrameworkCore.Storage.RelationalCommandParameterObject parameterObject, System.Threading.CancellationToken cancellationToken) [0x0057b] in <908a85714c18433696ab2103bcabebcc>:0 at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync (Microsoft.EntityFrameworkCore.Storage.IRelationalConnection connection, System.Threading.CancellationToken cancellationToken) [0x000cc] in <908a85714c18433696ab2103bcabebcc>:0

c#
sqlite
xamarin
xamarin.forms
entity-framework-core
asked on Stack Overflow Sep 28, 2020 by Sherif Awad

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0