Entity Framework: Когда добавляется дочерняя сущность, вместо ссылки на существующую сущность создается дублирующая родительская сущность? - PullRequest
0 голосов
/ 10 ноября 2018

enter image description here

Товар может иметь несколько отзывов. Отзыв сделан одним клиентом. Таким образом, в обзоре есть свойства Customer и Product.

Product.cs

namespace DatabaseProject.Models
{
    public class Product
    {
        public Product()
        {
            Reviews = new List < Review >();
        }

        public int Id { get; set; }
        public Catagory Catagory { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public string Specification { get; set; }
        public List<Review> Reviews { get; set; }
    }
}

Review.cs

namespace DatabaseProject.Models
{
    public class Review
    {
        public int Id { get; set; }
        public string Text { get; set; }
        public int Stars { get; set; }
        [Required]
        public Product Product { get; set; }
        [Required]
        public Customer Customer { get; set; }
    }
}

Customer.cs

namespace DatabaseProject.Models
{
    public class Customer
    {
        public Customer()
        {
            Addresses = new List<Address>();
            Reviews = new List<Review>();
        }

        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Email { get; set; }
        public string Password { get; set; }
        public List<Address> Addresses { get; set; }
        public List<Review> Reviews { get; set; }
    }
}

Способ добавления нового отзыва.

Я добавляю его в список отзывов в таблице товаров.

public bool AddReview(int id, Review review)
{
    using (var context = new ShopDbContext())
    {
        Product oldProduct = context.Products.Find(id);
        if (oldProduct == null)
        {
            return false;
        }
        oldProduct.Reviews.Add(review);


            context.SaveChanges();
            return true;
        }
    }

Добавление нового отзыва

Здесь, поскольку в продукт добавлен отзыв. Отзывы Мне не нужно было передавать свойство продукта.

Но я должен был передать клиенту. Каким-то образом это создает нового клиента, а не ссылается на существующего клиента.

    productService.AddReview(1,
        new Review
        {
            Customer = customerService.Get(1),
            Stars = 2,
            Text = "It's a good camera",
        });

Это приводит к дублированию записи в таблице «Клиенты».

enter image description here

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Ваша модель обзора должна иметь CustomerID , а модель обзора должна выглядеть следующим образом:

namespace DatabaseProject.Models
{
    public class Review
    {
        public int Id { get; set; }
        [Required]
        public int CustomerId { get; set; }
        [Required]
        public int ProductId { get; set; }
        public string Text { get; set; }
        public int Stars { get; set; }

        [ForeignKey("ProductId")]
        public Product Product { get; set; }

        [ForeignKey("CustomerId")]
        public Customer Customer { get; set; }
    }
}

И вы должны добавить новый отзыв, как это:

productService.AddReview(1,
    new Review
    {
        CustomerId = 1,
        Stars = 2,
        Text = "It's a good camera",
        ProductId = 1
    })

В данном коде вы передаете объект модели клиента в DbSet.Add method, который добавляет новую сущность в контекст

0 голосов
/ 10 ноября 2018

Я думаю, что вам нужно указать CustomerId в таблице отзывов и передать customerId при добавлении нового отзыва.

public class Review
{
    public int Id { get; set; }
    public string Text { get; set; }
    public int Stars { get; set; }
    [Required]
    public int ProductId { get; set; }
    [Required]
    public int CustomerId { get; set; }
    [ForeignKey("ProductId")]
    public Product Product { get; set; }
    [ForeignKey("CustomerId")]
    public Customer Customer { get; set; }
}

productService.AddReview(1,
    new Review
    {
        CustomerId = 1,
        ProductId = XXX,
        Stars = 2,
        Text = "It's a good camera",
    })

Затем вам потребуется создать внешний ключ между ProductId и Product table и CustomerId и Customer table.

Таким образом, вам не нужно загружать клиента / продукт при добавлении нового отзыва. Вам понадобятся только идентификаторы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...