【问题标题】:Entity Framework Required Foreign Key = validation error on db.SaveChanges实体框架所需的外键 = db.SaveChanges 上的验证错误
【发布时间】:2012-10-25 11:09:10
【问题描述】:

我的公司实体有这些课程

    public class Company
    {
        public Company()
        {
            this.Users = new HashSet<User>();
            this.Tools = new HashSet<Tool>();
        }

        public int Id { get; set; }
        public string Name { get; set; }
        public string Address { get; set; }

        public virtual ICollection<User> Users { get; set; }
        public virtual ICollection<Tool> Tools { get; set; }
        [Required]
        public virtual CompanyGroup CompanyGroup { get; set; }
    }

    public class CompanyDto
    {
        public string Name { get; set; }
        public string Address { get; set; }
    }

在 CompaniesController 中,我添加了一个带有 Id 参数的附加类,用于像这样的编辑/更新方法

    public class CompanyViewEditModel : CompanyDto {
        public int Id { get; set; }
    }

编辑方法如下所示:

        [HttpPost]
        public ActionResult Edit(CompanyViewEditModel companyViewModel)
        {
            if (ModelState.IsValid)
            {
                var company = db.Companies.Find(companyViewModel.Id);
                company.InjectFrom(companyViewModel);
                db.Entry(company).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(companyViewModel);
        }

InjectFrom 方法来自 ValueInjecter。

由于验证异常,只有 db.SaveChanges 调用失败,一切都按预期工作。通过对异常的一些挖掘,我发现他认为公司无效,因为字段 CompanyGroup 是必需的,但是如果我使用调试器查看公司变量,即使在 InjectFrom 调用之后一切似乎都很好。有对应的公司集团。

【问题讨论】:

标签: asp.net-mvc entity-framework


【解决方案1】:

考虑更改您的模型,因为您不必根据需要标记导航属性。而是像这样添加一个 FK。

public class Company
{
    public Company()
    {
        this.Users = new HashSet<User>();
        this.Tools = new HashSet<Tool>();
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }
    public int CompanyGroupId { get; set; }

    public virtual ICollection<User> Users { get; set; }
    public virtual ICollection<Tool> Tools { get; set; }
    public virtual CompanyGroup CompanyGroup { get; set; }
}

【讨论】:

  • 如果我添加它,我的数据库 shema 不再适合,因为该列名为 CompanyGroup_Id 是否有一种无需新迁移即可快速更改映射的方法?
  • 尝试public int CompanyGroup_Id { get; set; },它将映射到现有列。正如您在下面看到的那样,EF 只是为您创建了一个 FK,所以您不妨自己动手并做好。
  • 这也是我的第一次尝试,但不知何故,EF 意识到发生了一些变化并引发了异常。如果我尝试添加迁移,它会尝试创建一个名为 CompanyGroup_Id1 的列:(
  • 当您使用 Code First 时,会发生这种情况,因为数据库中的 __migrationhistory 表包含从您的代码创建的模型的哈希值。由于模型已更改,因此需要更新架构,因此如果没有迁移就无法做到这一点。
  • 它对 EF 没有任何影响,但大多数人使用它时不带下划线。它仅使用下划线创建,因为您在主模型中省略了 FK 关系。
猜你喜欢
  • 1970-01-01
  • 2019-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
相关资源
最近更新 更多