迁移-外键约束

时间:2020-02-29 20:51:38

标签: c# sql asp.net

我在运行迁移时使用Code First,但出现错误。

在表“用户”上引入外键约束“ FK_dbo.Users_dbo.Campaigns_CampaignID”可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。 无法创建约束。查看先前的错误。

请,我需要帮助,我不明白为什么会发生此错误。

我看过其他类似的出版物,但我解决不了。

谢谢

public class User  
{  
    public int ID { get; set; }  
    [StringLength(50, MinimumLength = 3)]  
    public string UserName { get; set; }  
    public string Password { get; set; }  
    [StringLength(50, MinimumLength = 3)]  

    public int CityID { get; set; }  
    public virtual City City { get; set; }  

    public int CampaignID { get; set; }  
    public virtual Campaign Campaign { get; set; }             

    public int RoomID { get; set; }  
    public virtual Room Room { get; set; }  

    public bool Status { get; set; }  
    public DateTime RegisterDate { get; set; }  
    public int UserCreator { get; set; }  
}

public class City  
{  
    public int ID { get; set; }  
    [StringLength(50, MinimumLength = 3)]  
    public string Name { get; set; }  

    public virtual ICollection Users { get; set; }  
}

public class Campaign  
{                
    public int ID { get; set; }  
    [StringLength(50, MinimumLength = 3)]  
    public string Name { get; set; }  

    public int CompanyID { get; set; }  
    public virtual Company Company { get; set; }  

    public virtual ICollection Users { get; set; }  
    public virtual ICollection Rooms { get; set; }  
}  

public class Company  
{  
    public int ID { get; set; }  
    [StringLength(30, MinimumLength = 3)]  
    public string Name { get; set; }  

    public virtual ICollection Campaigns { get; set; }  
}

public class Room  
{  
    public int ID { get; set; }  
    [MaxLength(200)]  
    public string RoomKey { get; set; }  
    [StringLength(30, MinimumLength = 3)]  
    public string Name { get; set; }         

    public int UserCreator { get; set; }  
    public virtual User User { get; set; }  

    public int CampaignID { get; set; }  
    public virtual Campaign Campaign { get; set; }  

    public virtual ICollection Messages { get; set; }  
}  

public class Message  
{  
       public int ID { get; set; }  
       public string Content { get; set; }          
       public string Timestamp { get; set; }  

       public int UserID { get; set; }  
       public virtual User User { get; set; }  

       public int RoomID { get; set; }  
       public virtual Room Room { get; set; }  
}

1 个答案:

答案 0 :(得分:0)

那是因为你搞砸了恋爱关系

用户->城市,战役,房间

广告系列->公司

房间->广告系列,用户(创建者)

消息->用户,房间

我想您将CampaignID和RoomID放置给用户的原因是,您想知道谁正在加入哪个广告系列和哪个房间。但这是错误的。

您需要的是用户的主数据,您只需要用户信息,而与广告系列或会议室没有关系。这些关系被视为事务数据,这意味着今天userA可以加入该会议室,但是明天userA可以加入另一个会议室。一年中,一位用户可以加入多个会议室,参与多个广告系列。我建议的解决方案是

用户->城市

RoomAttendees->用户ID,RoomID(您无需在此处使用CampaignID,因为会议室已获得对Campaign的引用)

广告系列->公司

房间->广告系列,用户(创建者)

消息->用户,房间