Обновить внешний ключ класса - PullRequest
0 голосов
/ 07 июня 2018

Я впервые делаю небольшое API-приложение для отдыха, и я застрял на одной конкретной вещи: обновите свой внешний ключ с помощью [HttpPost].

Что я имею в виду под обновлением?

Простой: рассмотрим следующее простое приложение: я хочу сделать клиентов и создать или назначить им тип клиента (например, «независимый» или «частный»)

Итак, у меня есть следующие классы:

public class Customer
{       
    [Key]
    public int Id { get; set; }

    public string Name { get; set; }
    public CustomerType CustomerType { get; set; }

    public Customer() { }
}

И

  public class CustomerType 
{
    [Key]
    public int Id { get; set; }

    public string CustomerTypeName { get; set; }
    public CustomerType () { }
}

Что я могу сделать в данный момент: я написал свой API, чтобы я мог одновременно создавать и нового customer, и CustomerType!

[Route("NewCustomer")] 
    [HttpPost]
    public Customer NewCustomer(Customer customer)
    {
        customerContext.Add(customer);
        customerContext.SaveChanges();
    }

Итак, откуда-то я получаю тело JSON, которое содержит мое имя клиента и CustomerType.Оба идентификатора равны 0, поэтому структура сущностей сохраняет их в базе данных и назначает идентификатор как для моего нового клиента, так и для нового CustomerType.

Однако: позже частные клиенты становятся независимыми клиентами.Теперь это уже существует в базе данных, поэтому нет необходимости создавать CustomerType "Independant".

Единственное, что я хочу сделать, это изменить идентификатор CustomerType клиента с 1 на 2 (скажем, 1 был закрытым, а 2 - независимым).

Когда я публикую его в своем API, яотправьте следующий JSON через почтальона:

  {
    "Id": 1,
    "Name": "Test1",
  "CustomerType ": {
        "Id": "2"
    },
  }

Когда я говорю, что saveChanges просто не работает, платформа Entity не распознает, что ей нужно только изменить CustomerTypeId с 1 на 2 (если это не так,Заказчик является независимым, а не частным).

Единственный способ, которым я могу заставить его работать в данный момент, - это сначала получить CustomerType с идентификатором 2 из базы данных и «привязать» его к моему клиенту:(не нужно смотреть на контексты и т. д., это пример кода)

[Route("NewCustomer")] 
    [HttpPost]
    public Customer NewCustomer(Customer customer)
    {
       CustomerType customerType=
      CustomerTypeContext.GetByID(customer.CustomerType.Id);
        customer.CustomerType = customerType;

        customerContext.Add(customer);
        customerContext.SaveChanges();
    }

Если я сделаю вышеизложенное, все будет работать отлично!Customer.CustomerType.Id изменился с 1 на 2, но зачем мне это делать?Разве я не могу сказать Entity Framework: Привет, как вы видите, Id изменился с 1 на 2, так что вы можете просто изменить ID и сохранить его?спасибо EF.

Кто-нибудь может мне помочь?Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Думаю, я его нашел.

В соответствии с EF мне нужно использовать Update вместо Add.

public virtual void UpdateZonderAttach(TEntity entityToUpdate)
    {
        context.Update<TEntity>(entityToUpdate);
    }

Из-за Update вместо Add EF будет искать каждую сущность, если онаУ него уже есть идентификатор или нет, но он не добавляет его, и если он делает, он обновляет, что для меня нормально, я думаю, возможно, было бы лучше просто «связать» его вместо полного обновления CustomerType

0 голосов
/ 07 июня 2018

Для создания отношения 1: n в платформе сущностей добавьте в свой код следующее ( Узнать больше ):

public class Customer
{  


[Key]
public int Id { get; set; }

public string Name { get; set; }
public CustomerType CustomerType { get; set; }
public int CustomerTypeId {get; set;}

public Customer() { }


}


  public class CustomerType 
{
    [Key]
    public int Id { get; set; }
    public ICollection<Customer> Customers {get; set}
    public string CustomerTypeName { get; set; }

    public CustomerType () { }
}

Если могут существовать клиенты без типа клиента, простосделать CustomerTypeId обнуляемым int? CustomerTypeId

Если вы используете свободный API, вы можете написать:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // configures one-to-many relationship
        modelBuilder.Entity<CustomerType>()
            .HasRequired<Customer>(c => c.CustomerTypeId)
            .WithMany(ct => ct.Customers)
            .HasForeignKey<int>(c => c.CustomerTypeId);          }
    }

Не забудьте добавить новую миграцию после внесения изменений в код и обновить вашбаза данных, например, с менеджером пакетов.Теперь структура сущностей знает об отношениях между Customer и CustomerType.

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