asp.net-core - EF Core 尝试添加新记录而不是更新 1:many 关系
问题描述
我不确定为什么在尝试创建实体时 1:many EF 尝试在 Asp Net Users 中添加新条目而不是更新 1:many
我有一个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);
那么 DB 中的 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);
}
也无济于事
解决方案
问题是由ServiceLifetime
DbContext 引起的
因为 User 被加载Controller
然后Service
被抛出,负责业务逻辑
我变了
(options => options.UseSqlServer(Configuration["Database:ConnectionString"]), ServiceLifetime.Transient);
到
(options => options.UseSqlServer(Configuration["Database:ConnectionString"]), ServiceLifetime.Scoped);
它工作正常。
推荐阅读
- python - 哪种设计模式适合通过 ldap3 库和 python 管理 Active Directory 安全组?
- r - 使用R中的igraph计算开放三角形顶点中节点的出现次数
- python - 使 Django 管理命令在部署中自动运行(apache2)
- powershell - 使用具有长路径的 Robocopy 复制单个文件
- javascript - post route express/sequelize的问题
- python - 在 Ubuntu 中运行 python3.8.2
- python - 如何将包含 float 和 nan 值的 Dataframe 转换为 datetime python?
- entity-framework-migrations - EF Core 5 迁移违反 PRIMARY KEY
- c++ - 无法添加用户输入的数组值
- c# - 获得控制台应用程序的同意