我是第一次制作一个小型的休息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。
任何人都可以帮助我吗? 提前谢谢!
答案 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