【问题标题】:Code first driving me crazy with foreign key exception代码优先让我因外键异常而发疯
【发布时间】:2011-11-13 10:39:04
【问题描述】:

这些是我的模型类:

public class Organization
{
        public Organization()
        {
        }

        [DisplayName("Organization Id")]
        public int OrganizationId { get; set; }

        [StringLength(128)]
        [DisplayName("Organization Name")]
        public string Name { get; set; }
}

public class User 
{
        public User()
        {
            Roles = new List<Role>();
        }

        [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
        [Key]
        public Guid UserGuid { get; set; }

        [StringLength(25)]
        public string FirstName { get; set; }

        [StringLength(25)]
        public string LastName { get; set; }

        public virtual List<Role> Roles { get; set; }

        public int OrganizationId { get; set; }

        [ForeignKey("OrganizationId")]
        public virtual Organization Organization { get; set; }
    }

这是我的代码:

 Organization organization = new Organization { Name = "Test", };
 context.Organizations.Add(organization);

我明白了:

INSERT 语句与 FOREIGN KEY 约束冲突 \"组织_用户\"。数据库发生冲突 \"SampleDB\",表 \"dbo.Organizations\",列 'OrganizationId'。\r\n语句已终止。

这不是很奇怪吗?我只是添加一个组织。它可能有什么问题?

PS:我的用户表确实有 OrganizationId 是外键并指向 Organization 表。到目前为止一切顺利,但为什么抛出异常?我正在添加一个主 Organization 记录。这如何违反外键约束?

【问题讨论】:

  • 如果我不得不猜测,OrganizationId 是外键。基本上意味着该组织不存在于它所引用的任何表中。
  • 外键Organization_Users在哪里?您没有在代码中显示它。是Organization 表的字段吗?
  • @Otiel:是Sql Server自动生成的外键关系名称。

标签: c# entity-framework entity-framework-4.1


【解决方案1】:

我希望也会为组织生成数据库 ID:

   [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
   [DisplayName("Organization Id")]
   public int OrganizationId { get; set; }

要么这样,要么您需要在保存之前自己将其设置为有效的唯一值

另一种猜测:

名称Organization_Users 表明存在(或曾经)从组织表到用户的关系(可能通过关系表)。你有完整的代码吗?代码数据库中有这种旧关系的残余吗?仅从 C# 代码中删除此类关系是不够的(因为数据库将继续检查约束,直到从实际数据库架构中删除未使用的字段/关系)。

【讨论】:

  • 它已经是数据库生成的,因为它遵循className + Id的约定。所以代码首先自动使其自动生成。反正把DatabaseGenerated 的explicit 属性放到这里还是不行。
  • 有一个外键关系因为这个代码而自动设置:"[ForeignKey("OrganizationId")] public virtual Organization Organization { get; set; }"
  • @Otiel:与答案无关。
  • 好的。我发现了问题。问题出在种子方法中。我在那里添加了一个用户对象,但没有分配组织 ID,这引发了这个异常。很抱歉由于我的愚蠢错误给您带来不便。在这之后浪费了 1 个小时。
  • 呵呵。感谢更新。也许您可以回答您的问题或将其标记为“已解决”,这样其他人就不会浪费时间了 :)
【解决方案2】:

似乎 EF 以错误的方向创建了这种关系。

User 类应该有一个 Organization 而不是 OrganizationID。

Organization 类应该有一个用户列表。

【讨论】:

    猜你喜欢
    • 2018-02-13
    • 1970-01-01
    • 2021-04-20
    • 2013-09-04
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多