在插入时创建重复的外键条目 - EF Core 和 Web Api 3.1

Duplicate Foreign Key entries being created on insert - EF Core and Web Api 3.1

我目前正在学习如何通过简单的一对多设置使用 EF Core,其中一个 user 可以有多个 items。在从表中检索数据方面,这对于某些 DTO 模型来说很好;然而,当我尝试通过邮递员添加一个 user 和多个 items 时,我注意到对于每个 item 它已经重复了用户很多次(即 user 与3 items 将创建 3 items 和 3 users):

邮递员(POST)

{
    "username": "xxx",
    "dob": "xxx",
    "location": "xxx",
    "items":[{
        "item": "xxx",
        "category": "xxx",
        "type": "xxx"
        },
        {
        "item": "xxx",
        "category": "xxx",
        "type": "xxx"

        },
        {
        "item": "xxx",
        "category": "xxx",
        "type": "xxx"

        }]
}

上下文:

namespace TestWebApplication.Database
{
    public class MyContext : DbContext
    {
        public DbSet<User> Users { get; set; }
        public DbSet<Items> Items { get; set; }

        public MyContext(DbContextOptions<MyContext> options)
            : base(options)
        {
            // erm, nothing here
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<User>()
                .HasMany(i => i.Items)
                .WithOne(u => u.User);
        }

        public override int SaveChanges()
        {
            var entities = from e in ChangeTracker.Entries()
                where e.State == EntityState.Added
                      || e.State == EntityState.Modified
                select e.Entity;

            foreach (var entity in entities)
            {
                var validationContext = new ValidationContext(entity);
                Validator.ValidateObject(entity, validationContext);
            }

            return base.SaveChanges();
        }
    }
}

控制器:

[HttpPost]
[Route("insertuseranditems")]
public ActionResult InsertUserAndItems(User user)
{
    if (ModelState.IsValid)
    {
        using (MyContext myContext = _myContext as MyContext)
        {
            myContext?.Users?.Add(user);
            int changes = myContext.SaveChanges();

            if (changes > 0)
            {
                return Created("User saved", user);
            }
        }
    }

    return Accepted();
}

项目:

namespace TestWebApplication.Database
{
    public class Items
    {
        [Key]
        public int ItemId { get; set; }
        public string Item { get; set; }
        public string Category { get; set; }
        public string Type { get; set; }
        public virtual User User { get; set; }
    }
}

用户:

namespace TestWebApplication.Database
{
    public class User
    {
        [Key]
        public int UserId { get; set; }
        public string UserName { get; set; }
        public string Dob { get; set; }
        public string Location { get; set; }
        public ICollection<Items> Items { get; set; }
    }
}

我重新审视了我的代码并将我的 Items.cs 模型更改为:

namespace TestWebApplication.Database
{
    public class Items
    {
        [Key]
        public int ItemId { get; set; }
        public string Item { get; set; }
        public string Category { get; set; }
        public string Type { get; set; }

        [ForeignKey("User")] // added this
        public int? UserId { get; set; } // added this

        public virtual User User { get; set; }
    }
}

现在,当我通过 Postman 发送上述 json 时,我得到了多个具有相同用户作为外键的项目。

以下网站似乎有所帮助:

The ForeignKey Attribute