更新类

时间:2018-06-07 17:46:10

标签: c# asp.net entity-framework rest api

我是第一次制作一个小型的休息API应用程序而且我完全停留在1 特别的事情:用[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,以便我可以创建新客户和CustomerType 同一时间!

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

所以我从某个地方获得了一个包含我的客户名称和CustomerType的JSON主体。两个ID均为0,因此实体框架将其保存在数据库中,并为我的新客户和新CustomerType分配ID。

然而:后来私人客户成为“独立”客户。现在,这已存在于数据库中,因此无需创建CustomerType“Independant”。

我唯一想做的就是将客户的CustomerType Id从1更改为2(假设1为Private,2为Independant)。

当我将其发布到我的API时,我通过Postman发送以下JSON:

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

当我说saveChanges它根本不起作用时,Entity框架无法识别它只需要将CustomerTypeId从1更改为2(一旦这样做,客户就是独立而不是私有)。

我现在唯一能让它工作的方法是,我首先从数据库中获取带有Id 2的CustomerType&将它“绑定”给我的客户:(无需查看上下文等,这是一个示例代码)

[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,但为什么我需要这样做?我不能对实体框架说:嘿,因为你可以看到Id从1变为2所以你可以请更改ID&保存 ?谢谢EF。

任何人都可以帮助我吗? 提前谢谢!

2 个答案:

答案 0 :(得分:0)

要在实体框架中创建1:n关系,请在代码中添加以下内容(learn more):

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);          }
    }

不要忘记在执行代码更改后添加新迁移并更新数据库,例如: G。与包管理器。 现在实体框架知道Customer和CustomerType之间的关系。

答案 1 :(得分:0)

想想我找到了它。

根据EF我需要使用Update而不是Add。

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

由于更新而不是添加,EF将查找每个实体(如果它已经具有ID),而不是它添加它&amp;如果确实如此,它会更新这对我来说很好,我想,最好只是“链接”它而不是完全更新CustomerType