При вставке создаются дублированные записи внешнего ключа - EF Core и Web Api 3.1 - PullRequest
0 голосов
/ 15 марта 2020

В настоящее время я изучаю, как работать с 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; }
    }
}

1 Ответ

0 голосов
/ 21 марта 2020

Я повторно посетил свой код и изменил свою модель 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; }
    }
}

Теперь, когда я отправляю вышеупомянутый json через Почтальона, я получаю несколько элементов с одним и тем же пользователем в качестве внешнего ключа .

Сайт, показанный ниже, помог:

Атрибут ForeignKey

...