EF Core尝试添加新记录而不是更新1:许多关系

时间:2019-08-25 19:26:47

标签: asp.net-core entity-framework-core

我不确定为什么尝试创建一个1:many的实体 EF尝试在Asp Net Users中添加新条目,而不是更新1:很多

我有一个user,其中有许多items

  

SqlException:违反主键约束'PK_AspNetUsers'。无法在对象'dbo.AspNetUsers'中插入重复的密钥。重复的键值为(cdbb1f2f-ddcf-40c0-97ec-f50f8049d87a)。

public class Context : IdentityDbContext
{
    public Context(DbContextOptions options) : base(options)
    {
    }

    public DbSet<User> Users { get; set; }

    public DbSet<Item> Items { get; set; }

    public DbSet<File> Files { get; set; }
}

public class User : IdentityUser
{
    public List<Item> Items { get; set; } = new List<Item>();
}

public class Item
{
    private Item()
    {

    }

    public Item(string title, User owner, File file)
    {
        Title = title;
        Owner = owner;
        File = file;
    }

    public int Id { get; private set; }

    public string Title { get; set; }

    public User Owner { get; set; }

    public File File { get; set; }

    public DateTime CreationDate { get; } = DateTime.Now;
}

这是问题所在:

var fileResult = await _file.SaveFile(input.File);
var item = new Item(input.Title, user, fileResult.File);

user.Items.Add(item);
await _context.Items.AddAsync(item);
await _context.SaveChangesAsync();

用户已加载:

public User GetUser()
{
    return _context.Users.FirstOrDefault(x => x.UserName == _http.HttpContext.User.Identity.Name);
}

我尝试过:

当我改变

public Item(string title, User owner, File file)
{
    Title = title;
    Owner = owner;
    File = file;
}

只是:

public Item(string title, File file)
{
    Title = title;
    File = file;
}

并让其处理:

user.Items.Add(item);

然后数据库中的OwnerId为空

使用:

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

    modelBuilder.Entity<User>()
        .HasMany(x => x.Items)
        .WithOne(x => x.Owner);

    modelBuilder.Entity<Item>().HasOne(x => x.Owner);
}

也没有帮助

1 个答案:

答案 0 :(得分:1)

该问题是由DbContext的ServiceLifetime引起的

因为用户已加载到Controller中,然后又陷入了负责业务逻辑的Service中,所以

我改变了

(options => options.UseSqlServer(Configuration["Database:ConnectionString"]), ServiceLifetime.Transient);

(options => options.UseSqlServer(Configuration["Database:ConnectionString"]), ServiceLifetime.Scoped);

它工作正常。