C# ASP.NET MVC 3 EF代码优先-外键问题

C# ASP.NET MVC 3 EF代码优先-外键问题,c#,foreign-keys,ef-code-first,C#,Foreign Keys,Ef Code First,首先使用实体框架代码时,SQL Server在创建外键约束时遇到问题 这是我的设想。我正在构建一个应用程序,允许我们根据任何系统记录票据,并自动将票据分配给相关人员 我们有服务,可以有很多种类。类别可以有许多子类别。可以将帮助台人员分配到服务、类别或子类别 以下是我的课程: 服务中心 public class Service { [Key] public int ServiceID { get; set; } public string Title { get; set

首先使用实体框架代码时,SQL Server在创建外键约束时遇到问题

这是我的设想。我正在构建一个应用程序,允许我们根据任何系统记录票据,并自动将票据分配给相关人员

我们有服务,可以有很多种类。类别可以有许多子类别。可以将帮助台人员分配到服务、类别或子类别

以下是我的课程:

服务中心

public class Service
{
    [Key]
    public int ServiceID { get; set; }

    public string Title { get; set; }
    public DateTime CreatedDate { get; set; }
    public HelpDeskMember CreatedBy { get; set; }
    public DateTime? DeletedDate { get; set; }
    public HelpDeskMember DeletedBy { get; set; }

    public virtual ICollection<Category> Categories { get; set; }
    public virtual ICollection<Subcategory> Subcategories { get; set; }
    public virtual ICollection<HelpDeskMember> LinesOfSupport { get; set; }
}
公共类服务
{
[关键]
public int ServiceID{get;set;}
公共字符串标题{get;set;}
公共日期时间CreatedDate{get;set;}
公共HelpDeskMember由{get;set;}创建
公共日期时间?删除日期{get;set;}
public HelpDeskMember DeletedBy{get;set;}
公共虚拟ICollection类别{get;set;}
公共虚拟ICollection子类别{get;set;}
公共虚拟ICollection行支持{get;set;}
}
C类

public class Category
{
    [Key]
    public int CategoryID { get; set; }
    [ForeignKey("Service")]
    public int ServiceID { get; set; }

    public string Title { get; set; }
    public DateTime CreatedDate { get; set; }
    public HelpDeskMember CreatedBy { get; set; }
    public DateTime? DeletedDate { get; set; }
    public HelpDeskMember DeletedBy { get; set; }

    public virtual Service Service { get; set; }
    public virtual ICollection<Subcategory> Subcategories { get; set; }
    public virtual ICollection<HelpDeskMember> LinesOfSupport { get; set; }
}
public class Subcategory
{
    [Key]
    public int SubcategoryID { get; set; }
    [ForeignKey("Service")]
    public int ServiceID { get; set; }
    [ForeignKey("Category")]
    public int CategoryID { get; set; }

    public string Title { get; set; }
    public DateTime CreatedDate { get; set; }
    public HelpDeskMember CreatedBy { get; set; }
    public DateTime? DeletedDate { get; set; }
    public HelpDeskMember DeletedBy { get; set; }

    public virtual Service Service { get; set; }
    public virtual Category Category { get; set; }
    public virtual ICollection<HelpDeskMember> LinesOfSupport { get; set; }       
}
公共类类别
{
[关键]
public int CategoryID{get;set;}
[外键(“服务”)]
public int ServiceID{get;set;}
公共字符串标题{get;set;}
公共日期时间CreatedDate{get;set;}
公共HelpDeskMember由{get;set;}创建
公共日期时间?删除日期{get;set;}
public HelpDeskMember DeletedBy{get;set;}
公共虚拟服务服务{get;set;}
公共虚拟ICollection子类别{get;set;}
公共虚拟ICollection行支持{get;set;}
}
子类别.cs

public class Category
{
    [Key]
    public int CategoryID { get; set; }
    [ForeignKey("Service")]
    public int ServiceID { get; set; }

    public string Title { get; set; }
    public DateTime CreatedDate { get; set; }
    public HelpDeskMember CreatedBy { get; set; }
    public DateTime? DeletedDate { get; set; }
    public HelpDeskMember DeletedBy { get; set; }

    public virtual Service Service { get; set; }
    public virtual ICollection<Subcategory> Subcategories { get; set; }
    public virtual ICollection<HelpDeskMember> LinesOfSupport { get; set; }
}
public class Subcategory
{
    [Key]
    public int SubcategoryID { get; set; }
    [ForeignKey("Service")]
    public int ServiceID { get; set; }
    [ForeignKey("Category")]
    public int CategoryID { get; set; }

    public string Title { get; set; }
    public DateTime CreatedDate { get; set; }
    public HelpDeskMember CreatedBy { get; set; }
    public DateTime? DeletedDate { get; set; }
    public HelpDeskMember DeletedBy { get; set; }

    public virtual Service Service { get; set; }
    public virtual Category Category { get; set; }
    public virtual ICollection<HelpDeskMember> LinesOfSupport { get; set; }       
}
公共类子类别
{
[关键]
公共int子类别ID{get;set;}
[外键(“服务”)]
public int ServiceID{get;set;}
[外键(“类别”)]
public int CategoryID{get;set;}
公共字符串标题{get;set;}
公共日期时间CreatedDate{get;set;}
公共HelpDeskMember由{get;set;}创建
公共日期时间?删除日期{get;set;}
public HelpDeskMember DeletedBy{get;set;}
公共虚拟服务服务{get;set;}
公共虚拟类别{get;set;}
公共虚拟ICollection行支持{get;set;}
}
最后是HelpDeskMember.cs

public class HelpDeskMember
{
    public int HelpDeskMemberID { get; set; }
    public string Name { get; set; }
    public bool Admin { get; set; }
    public bool Available { get; set; }
    public DateTime? CreatedDate { get; set; }
    public DateTime? LastLogin { get; set; }
    public DateTime? DeletedDate { get; set; }
    public DateTime? DeletedBy { get; set; }

    public virtual ICollection<Service> Services { get; set; }
    public virtual ICollection<Category> Categories { get; set; }
    public virtual ICollection<Subcategory> Subcategories { get; set; }

}
公共类HelpDeskMember
{
public int-HelpDeskMemberID{get;set;}
公共字符串名称{get;set;}
公共bool Admin{get;set;}
公共bool可用{get;set;}
公共日期时间?CreatedDate{get;set;}
公共日期时间?LastLogin{get;set;}
公共日期时间?删除日期{get;set;}
公共日期时间?通过{get;set;}删除
公共虚拟ICollection服务{get;set;}
公共虚拟ICollection类别{get;set;}
公共虚拟ICollection子类别{get;set;}
}
初始化数据库时,我收到以下错误消息:

在表“子类别”上引入外键约束“子类别\服务”可能会导致循环或多个级联路径。指定“在删除时不执行操作”或“在更新时不执行操作”,或修改其他外键约束。 无法创建约束。请参阅前面的错误。


我猜问题在于我是如何定义密钥和ForeignKey的。谢谢你的帮助。谢谢。

根据您的需要。您可以在实体的配置中使用
WillCascadeOnDelete(false)
或全局删除
onetomanycascadeodelete约定


可以使用
ModelBuilder
输入参数在中设置这两个参数。

取决于您的需要。您可以在实体的配置中使用
WillCascadeOnDelete(false)
或全局删除
onetomanycascadeodelete约定


可以使用
ModelBuilder
input参数设置这两个参数。

感谢您的回复。在哪里设置此配置?它会在DbContext中吗?@garethleiss确实如此。我也更新了我的答案,提供了更多的细节。谢谢你的回复。在哪里设置此配置?它会在DbContext中吗?@garethleiss确实如此。我还更新了我的答案,提供了更多细节。