Ожидалось, что операция базы данных повлияет на 1 строку(и), но на самом деле затронула 0 строк;C#

Место общения программистов C#
Anonymous
Ожидалось, что операция базы данных повлияет на 1 строку(и), но на самом деле затронула 0 строк;

Сообщение Anonymous »

У меня есть простая сущность ExternalAccount:

Код: Выделить всё

namespace Domain
{
public class ExternalAccount
{
public Guid Id { get; set; }

public string APIKey { get; set; }
}
}
и сущность AppUser, которая имеет связь один-ко-многим с externalAccount

Код: Выделить всё

using Microsoft.AspNetCore.Identity;

namespace Domain
{
public class AppUser : IdentityUser
{
public ICollection ExternalAccounts { get; set; } = new List();
}
}
Мой класс DataContext также довольно прост:

Код: Выделить всё

using Domain;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;

namespace Persistence
{
public class DataContext : IdentityDbContext
{
public DataContext(DbContextOptions options) : base(options)
{

}

public DbSet ExternalAccounts { get; set; }
}
}
Теперь для простоты у меня есть метод, который содержит следующее:

Код: Выделить всё

var user = await _context.Users.Include(p => p.ExternalAccounts).FirstOrDefaultAsync(x => x.UserName == "Bob");

if (user == null) return null;

ExternalAccount account = new ExternalAccount
{
Id = Guid.Parse("08186b29-e603-4cc8-9575-47b237775274"),
APIKey = "some long text here",
};

user.ExternalAccounts.Add(account);

var result = await _context.SaveChangesAsync() > 0;
После нажатия на последнюю строку я получаю

Код: Выделить всё

"statusCode": 500,
"message": "The database operation was expected to affect 1 row(s), but actually affected 0 row(s); data may have been modified or deleted since entities were loaded. See http://go.microsoft.com/fwlink/?LinkId=527962 for information on understanding and handling optimistic concurrency exceptions.",
Если во время отладки я наведу курсор на user.ExternalAccounts.Add(account);, похоже, что учетная запись добавлена.
Изображение

Есть идеи, в чем может быть проблема?< /p>
Редактировать 1: не решено, я просматривал https://learn.microsoft.com/en-us/ef/co ... %2Cfluent- api-simple-key%2Csimple-key и прочитайте, что «включения только одного свойства навигации (без обратной навигации и без свойства внешнего ключа) достаточно, чтобы отношения были определены соглашением». Я подумал, что с «традиционным способом» может возникнуть проблема, поэтому я попытался явно определить взаимосвязь:

Код: Выделить всё

namespace Domain
{
public class ExternalAccount
{
public Guid Id { get; set; }

public string APIKey { get; set; }

public string AppUserForeignKey { get; set; }

public AppUser AppUser { get; set; }
}
}
и

Код: Выделить всё

using Domain;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using System.Diagnostics;

namespace Persistence
{
public class DataContext : IdentityDbContext
{
public DataContext(DbContextOptions options) : base(options)
{

}

public DbSet ExternalAccounts { get; set; }

protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);

builder.Entity()
.HasOne(u => u.AppUser)
.WithMany(a => a.ExternalAccounts)
.HasForeignKey(k => k.AppUserForeignKey);
}

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.LogTo(message => Debug.WriteLine(message));
}
}
Это по-прежнему возвращало ту же ошибку.
Добавлено ведение журнала, как предложено ниже в комментариях.
Миграция выглядит следующим образом: https://pastebin.com/raw/gLs1suBT
Журнал: https://pastebin.com/raw/GH8V2Y9q

Подробнее здесь: https://stackoverflow.com/questions/749 ... affected-0

Вернуться в «C#»