Ef Code First外部复合键失败

时间:2013-08-14 10:13:11

标签: c# entity-framework ef-code-first

我已经使用以下类进行了codefirst迁移:

public class User
    {
        public int Id { get; set; }

        public string Name { get; set; }

        public virtual ICollection<Chat> Chats { get; set; }
    }

public class Chat

{
    [Key, Column(Order = 0)]
    public int User1Id { get; set; }

    public virtual User User1 { get; set; }

    [Key, Column(Order = 1)]
    public int User2Id { get; set; }

    public virtual User User2 { get; set; }

    public string Channel { get; set; }
}

创意是聊天有两个用户,聊天主键是两个用户ID的复合键,它们是外键。

用户还有一个聊天列表,他参与其中。

现在当我尝试运行它时,我收到以下错误:

Introducing FOREIGN KEY constraint 'FK_dbo.Chat_dbo.User_User2Id' on table 'Chat' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint. See previous errors.

我有点理解发生了什么,但我不知道如何解决它。试过这个(来自某个地方的话题):

public DbSet<User> Users { get; set; }
        public DbSet<Chat> Chats { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

            modelBuilder.Entity<Chat>()
                .HasRequired(s => s.User1)
                .WithMany()
                .WillCascadeOnDelete(true);

            modelBuilder.Entity<Chat>()
                .HasRequired(s => s.User2)
                .WithMany()
                .WillCascadeOnDelete(true);

            base.OnModelCreating(modelBuilder);
        }

但没有结果,我仍然得到错误。任何人都可以对这件事情发表一些看法吗?

1 个答案:

答案 0 :(得分:1)

public class User
{
    public int Id { get; set; }

    public string Name { get; set; }

    public virtual ICollection<Chat> InitiatedChats { get; set; }
    public virtual ICollection<Chat> ParticipantInChats { get; set; }
}
public class Chat
{
    [Key, Column(Order = 0)]
    public int User1Id { get; set; }

    public virtual User User1 { get; set; }

    [Key, Column(Order = 1)]
    public int User2Id { get; set; }

    public virtual User User2 { get; set; }

    public string Channel { get; set; }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Chat>()
        .HasRequired(s => s.User1)
        .WithMany(u => u.InitiatedChats)
        .HasForeignKey(s => s.User1Id)
        .WillCascadeOnDelete(false);

    modelBuilder.Entity<Chat>()
        .HasRequired(s => s.User2)
        .WithMany(u => u.ParticipantInChats)
        .HasForeignKey(s => s.User2Id)
        .WillCascadeOnDelete(false);

    base.OnModelCreating(modelBuilder);
}

答案来自this帖子

相关问题