我在.NET API中有一个基本实体类,它与前端角度框架相结合。我有两个班,项目和公司。在创建项目时,我需要分配一个公司。向项目控制器发送POST请求时,不保存公司。
这个班是:
public class Project
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public Company Company { get; set; }
public Contact Contact { get; set; }
public User2 User { get; set; }
}
控制器方法是:
// POST: api/Projects
[ResponseType(typeof(Project))]
public IHttpActionResult PostProject(Project project)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.Projects.Add(project);
db.SaveChanges();
return CreatedAtRoute("DefaultApi", new { id = project.Id }, project);
}
json POST数据在这里
{
"name":"project name",
"description":"text description",
"company":{"id":"1"},
"contact":{"id":"1"},
"user":{"id":"1"}
}
为什么公司,联系人,用户的id不是更新外键表?传入控制器方法以保存外键需要什么值?
外键,表示它的值取决于父表的值。含义,从父表中插入它所依赖的列的值。
外键是用于将两个表链接在一起的键。这有时也称为引用键。
外键是列或列的组合,其值与不同表中的主键匹配。
2个表之间的关系匹配其中一个表中的主键与第二个表中的外键。
如果表在任何字段上定义了主键,则您不能拥有两个具有该字段相同值的记录。
因此,为了解决您的问题并更正您的代码,您必须知道列所依赖的主键的值是什么。
因此也是约束错误。
如果我再次需要这个。在保存之前,必须由db上下文检索相关实体,否则它将创建新的相关实体。仅传入ID作为属性时,首先从db中检索相关实体。
// POST: api/Projects
[ResponseType(typeof(Project))]
public IHttpActionResult PostProject(Project project)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.Projects.Add(project);
project.Company = db.Companies.First(x => x.Id == project.Company.Id);
project.User = db.User2.First(x => x.Id == project.User.Id);
project.Contact = db.Contacts.First(x => x.Id == project.Contact.Id);
try
{
db.SaveChanges();
}
catch (Exception e)
{
Debug.Write(e);
}
return CreatedAtRoute("DefaultApi", new { id = project.Id }, project);
}