Оператор INSERT конфликтует с ограничением FOREIGN KEY (EF Core) - PullRequest
0 голосов
/ 25 мая 2020

Я работаю над школьным проектом, включающим ASP. NET Core MVC, и я также использую EF Core, с которым, похоже, не могу понять, потому что я продолжаю получать эту ошибку:

Оператор INSERT конфликтует с ограничением FOREIGN KEY «FK_Transactions_Accounts_AccountId». Конфликт произошел в базе данных «MoneyManagerDB», таблица «dbo.Accounts», столбец «Id».

Layout

Каждый пользователь (ApplicationUser) имеет 0..n учетных записей (банковский счет, кредитная карта и т. д. c.), и каждая учетная запись имеет 0..n транзакций, каждая из которых имеет 1 категорию.

У меня есть некоторые ошибки, которые я не совсем понимаю, как исправить (и да, я просмотрел другие сообщения, но они, похоже, не помогли)

Модели

public class ApplicationUser : IdentityUser
{
    [Required,
    MaxLength(50, ErrorMessage = "Username cannot exceed 50 characters")]
    public string Name { get; set; }
    public DateTime RegistrationDate { get; set; }
    public List<Account> Accounts { get; set; } = new List<Account>();
}

public class Entity
{
    [Key]
    public int Id { get; set; }

    [Required]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public DateTime CreatedOn { get; set; } = DateTime.UtcNow;
}

public class Account : Entity
{
    public string Name { get; set; }
    [Column(TypeName = "decimal(18,2)")]
    public decimal Balance { get; set; }
    public List<Transaction> Transactions { get; set; } = new List<Transaction>();

    public string  ApplicationUserId { get; set; }
    public ApplicationUser ApplicationUser { get; set; }
}

public class Transaction : Entity
{
    public string Name { get; set; }
    [Column(TypeName = "decimal(18,2)")]
    public decimal Amount { get; set; }
    public Category Category { get; set; }

    public int AccountId { get; set; }
    public Account Account { get; set; }
}

public class Category : Entity
{
    public string Name { get; set; }

    public int TransactionId { get; set; }
    public Transaction Transaction { get; set; }
}

DbContext

public class AppDbContext : IdentityDbContext<ApplicationUser>
{
    public AppDbContext(DbContextOptions options) : base(options)
    {
    }

    public DbSet<ApplicationUser> Users { get; set; }
    public DbSet<Account> Accounts { get; set; }
    public DbSet<Transaction> Transactions { get; set; }
    public DbSet<Category> Categories { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<ApplicationUser>()
            .HasMany(user => user.Accounts)
            .WithOne(account => account.ApplicationUser)
            .HasForeignKey(account => account.ApplicationUserId)
            .IsRequired();

        modelBuilder.Entity<Account>()
            .HasMany(account => account.Transactions)
            .WithOne(transaction => transaction.Account)
            .HasForeignKey(transaction => transaction.AccountId)
            .IsRequired();

        modelBuilder.Entity<Transaction>()
            .HasOne(transaction => transaction.Account)
            .WithMany(account => account.Transactions)
            .HasForeignKey(transaction => transaction.AccountId)
            .IsRequired();

        modelBuilder.Entity<Transaction>()
            .HasOne(transaction => transaction.Category)
            .WithOne(category => category.Transaction)
            .HasForeignKey<Category>(category => category.TransactionId)
            .IsRequired();

        modelBuilder.Entity<Category>()
            .HasOne(category => category.Transaction)
            .WithOne(transaction => transaction.Category)
            .HasForeignKey<Transaction>(transaction => transaction.Id);
    }
}

Кажется, я не могу правильно понять часть базы данных и не уверен, что делать. Кто может помочь, тот спасает жизнь!

1 Ответ

0 голосов
/ 25 мая 2020

Использовать атрибут ForeignKey.

public class Transaction : Entity
{
    public string Name { get; set; }
    [Column(TypeName = "decimal(18,2)")]
    public decimal Amount { get; set; }
    public Category Category { get; set; }
    [ForeignKey("Account")]
    public int AccountId { get; set; }
    public Account Account { get; set; }
}

Также в классе категории

public class Category : Entity
{
    public string Name { get; set; }
    [ForeignKey("Transaction ")]
    public int TransactionId { get; set; }
    public Transaction Transaction { get; set; }
}

См. Это https://forums.asp.net/t/2003631.aspx?Code+first+The+INSERT+statement+conflicted+with+the+FOREIGN+KEY+constraint+

...