我正在使用MVC实体框架5制作票务系统。
我的类如何映射:
用户到管理员是1到0..1(我可以为一些用户分配管理员状态,但我不希望每个用户都拥有它)
管理员到故障单是1到1(您只能将1个管理员(以解决问题)分配给故障单)
用户到故障单是1到多(一个用户可以创建多个故障单)
我遇到这个问题,如果我创建一个没有adminID的用户的票证(查看here)它会给我以下错误:
INSERT语句与FOREIGN KEY约束冲突 “FK_dbo.Ticket_dbo.Administrator_UserID”。冲突发生在 数据库“RecreationalServicesTicketingSystem.DAL.IssueContext”,表 “dbo.Administrator”,列'UserID'。声明一直如此 终止。
我认为问题在于“管理员与门票”之间的映射。 1对1关系强制条件,如果我创建票证,用户必须具有“adminID”或数据库中存在冲突。
我的问题是,Admin to Tickets应该采用什么映射来解决此问题? 也许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; }*
}
应用安迪的解决方案,我让管理员签订了1:多种关系
(在Ticket.cs中添加了public virtual Administrator Administrator { get; set; }
)
INSERT语句与FOREIGN KEY约束冲突 “FK_dbo.Ticket_dbo.Administrator_UserID”。冲突发生在 数据库“RecreationalServicesTicketingSystem.DAL.IssueContext”,表 “dbo.Administrator”,列'UserID'。声明一直如此 终止。
管理员
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; }*
}
答案 0 :(得分:1)
Ticket的adminID属性不能接受nullable int,因此它必须具有admin。我猜你不想在开始时需要它,它会在以后分配吗?应该是int?
。