【问题标题】:INSERT statement conflicted with the FOREIGN KEYINSERT 语句与 FOREIGN KEY 冲突
【发布时间】:2016-03-10 02:25:32
【问题描述】:

我正在使用 MVC Entity Framework 5 制作票务系统。

我的类是如何映射的:

用户到管理员是 1 到 0..1(我可以为一些用户分配管理员身份,但我不希望每个用户都拥有它)

工单管理员是一对一的(您只能为工单分配 1 个管理员(解决问题))

用户到工单是一对多(一个用户可以创建多个工单)

我遇到了这个问题,如果我使用没有 adminID 的用户创建票证(查看 here),它会给我以下错误:

INSERT 语句与 FOREIGN KEY 约束冲突 “FK_dbo.Ticket_dbo.Administrator_UserID”。冲突发生在 数据库“RecreationalServicesTicketingSystem.DAL.IssueContext”,表 “dbo.Administrator”,“用户 ID”列。该声明已 终止。

我认为问题在于“管理员到工单”之间的映射。 1 对 1 的关系强制条件是,如果我创建票证,用户必须具有“adminID”,否则数据库中存在冲突。

我的问题是管理员到工单的映射应该是什么来解决这个问题? 也许 1 比 0..*(1 比 1 或许多)能解决问题吗?

管理员

public class Administrator
{
    [ForeignKey("User")]
    public int UserID { get; set; }
    [StringLength(50)]
    public virtual User User { get; set; }

    [Key]
    *public int AdminID { get; set; }
    public virtual ICollection<Ticket> Tickets { get; set; }* 
}

Ticket.cs

public enum Priority
{
    Low, Med, High
}

public class Ticket
{
    public int TicketID { get; set; }
    public string Issue { get; set; }
    [DisplayFormat(NullDisplayText = "No Priority")]
    public Priority? Priority { get; set; }
    [ForeignKey("CategoryID")]
    public virtual Category Category { get; set; }
    public int CategoryID { get; set; }
    [ForeignKey("UserID")]
    public virtual User User { get; set; }
    public int UserID { get; set; }


    *public int AdminID { get; set; }*
}

应用了 Andy 的解决方案,我将 Admin to Ticket 设置为 1:Many 关系 (在 Ticket.cs 中添加了public virtual Administrator Administrator { get; set; }

Error LOOK HERE

INSERT 语句与 FOREIGN KEY 约束冲突 “FK_dbo.Ticket_dbo.Administrator_UserID”。冲突发生在 数据库“RecreationalServicesTicketingSystem.DAL.IssueContext”,表 “dbo.Administrator”,“用户 ID”列。该声明已 终止。

管理员

public class Administrator
{
    [ForeignKey("User")]
    public int UserID { get; set; }
    [StringLength(50)]
    public virtual User User { get; set; }

    [Key]
    *public int AdminID { get; set; }
    public virtual ICollection<Ticket> Tickets { get; set; }* 
}

public class Ticket
{
    public int TicketID { get; set; }
    public string Issue { get; set; }
    [DisplayFormat(NullDisplayText = "No Priority")]
    public Priority? Priority { get; set; }
    [ForeignKey("CategoryID")]
    public virtual Category Category { get; set; }
    public int CategoryID { get; set; }
    [ForeignKey("UserID")]
    public virtual User User { get; set; }
    public int UserID { get; set; }


    *public int AdminID { get; set; }
    public virtual Administrator Administrator { get; set; }*
}

【问题讨论】:

  • 工单到管理员 1:1 - 只有一个管理员可以处理工单,管理员到工单 1:many - 一个管理员可以分配到多个工单。
  • 有人建议我将 adminID 设为可为空的 int int?。会有同样的效果吗?

标签: c# sql entity-framework


【解决方案1】:

Ticket 的 adminID 属性不能接受可为空的 int,因此它必须有一个管理员。我猜你不希望一开始就需要它,它会在以后分配?应该是int?

【讨论】:

  • 你在说什么“一开始就需要”?所以我只是去 Administrator.cs 和 Ticket.cs 中的public int AdminID { get; set; }?我只是想知道,因为@Kevin 说我应该将关系更改为 1:many,以便可以将管理员分配给多个工单。您的解决方案也可以这样工作吗?
  • 创建工单的时候还不认识当时的管理员?一段时间后,管理员被分配给工单?如果是这样,则 AdminId 在分配之前应该为空。如果在创建工单时分配了管理员,那就另当别论了。
  • 所以我重新编辑了问题中的代码,假设是 1(admin) to many relationship(ticket) 。来源:blog.stevensanderson.com/2011/01/28/… 但它给了我图像 2 中的错误(看有问题)。
  • 为什么管理员是一个单独的类?为什么不从 User 继承,或者只在 User 类上使用 UserType?似乎是多余的。该错误表明您正在尝试为管理员设置 UserId,并且该 UserId 不存在。它与票证无关。
  • @将来我希望具有管理员身份的用户能够访问比普通用户更多的网站链接。如果我遵循您的解决方案,我不确定是否可以这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
  • 2021-05-30
相关资源
最近更新 更多