基本实体框架Web API:INSERT语句与FOREIGN KEY约束冲突

问题描述 投票:0回答:2

我在.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不是更新外键表?传入控制器方法以保存外键需要什么值?

javascript asp.net asp.net-web-api
2个回答
1
投票

外键,表示它的值取决于父表的值。含义,从父表中插入它所依赖的列的值。

来自Tutorials Point

外键是用于将两个表链接在一起的键。这有时也称为引用键。

外键是列或列的组合,其值与不同表中的主键匹配。

2个表之间的关系匹配其中一个表中的主键与第二个表中的外键。

如果表在任何字段上定义了主键,则您不能拥有两个具有该字段相同值的记录。

因此,为了解决您的问题并更正您的代码,您必须知道列所依赖的主键的值是什么。

因此也是约束错误。


0
投票

如果我再次需要这个。在保存之前,必须由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);
    }
© www.soinside.com 2019 - 2024. All rights reserved.