【问题标题】:Basic Entity Framework Web API: The INSERT statement conflicted with the FOREIGN KEY constraint基本实体框架 Web API:INSERT 语句与 FOREIGN KEY 约束冲突
【发布时间】:2018-06-10 22:30:36
【问题描述】:

我在 .NET API 中有一个与前端 Angular 框架相结合的基本实体类。我有两个课程,项目和公司。创建项目时,我需要分配一个公司。向项目控制器发送 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


    【解决方案1】:

    外键,意味着它的值取决于父表中的值。 含义,将其插入父表所依赖的列的值。

    来自Tutorials Point

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

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

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

    如果表的任何字段都定义了主键,那么您不能 有两条记录具有相同的字段值。

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

    这也是约束错误。

    【讨论】:

    • 感谢您的解释。这对我理解这个问题有点帮助。实体框架应该使这部分过程自动化,但我显然错过了它的设置方式。知道实体如何自动查找该外键吗?
    【解决方案2】:

    如果我再次需要这个。相关实体必须在保存之前由 db 上下文检索,否则它将创建一个新的相关实体。 当只传入 ID 作为属性时,首先从数据库中检索相关实体。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-19
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2017-06-29
      相关资源
      最近更新 更多