引用外键中的列的实体框架与引用列的数量不同

时间:2014-11-10 14:53:27

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

我首先使用的是Entity Framework代码,我正在尝试使用-update-database命令运行我的迁移/数据库,但我一直收到此错误:

  

System.Data.SqlClient.SqlException(0x80131904):外键中的引用列数与引用列数(表'dbo.FileSections')不同。

在这个SQL命令之后直接发生(EF正在魔术化):

ALTER TABLE [dbo].[FileSections] ADD CONSTRAINT [FK_dbo.FileSections_dbo.Sections_Section_Id] FOREIGN KEY ([Section_Id]) REFERENCES [dbo].[Sections] ([Id], [EventName]) ON DELETE CASCADE

我的问题的简化版本是一个事件(字符串“名称”的主键)可以有许多部分,而一个部分(整数“Id”的主键)可以有许多文件(具有主键的文件)字符串“Id”)。简化的类是:

public class Event {
    public string Name { get; set; }
    public List<Section> Sections { get; set; }
}

public class Section {
    public int Id { get; set; }
    public string EventName { get; set; }
    public string Title { get; set; }
    public List<File> Files { get; set; }
}

public class File {
    public string Id { get; set; }
    public int SectionId { get; set; }
    public string FileName { get; set; }
}

我还首先使用代码,其设置如下:

protected override void OnModelCreating(DbModelBuilder modelBuilder) {
    modelBuilder.Entity<Event>()
        .HasKey(X => X.Name);
    modelBuilder.Entity<Event>()
        .HasMany(X => X.Sections)
        .WithRequired(X => X.Event)
        .WillCascadeOnDelete();    

    modelBuilder.Entity<Section>()
        .HasKey(x => x.Id); 
    modelBuilder.Entity<Section>()
        .HasRequired(x => x.Event)
        .WithMany(x => x.Sections)
        .HasForeignKey(x => x.EventName);
    modelBuilder.Entity<Section>()
        .HasMany(x => x.Files)
        .WithRequired(x => x.Section)
        .HasForeignKey(x => x.SectionId)
        .WillCascadeOnDelete();

    modelBuilder.Entity<File>()
        .HasKey(x => x.Id);
    modelBuilder.Entity<File>()
        .HasRequired(x => x.Section)
        .WithMany(x => x.Files)
        .HasForeignKey(x => x.SectionId);
}

我做错了什么?我也尝试使用复合主键(因此复合外键),但这仍然给我同样的错误。我真的是在我的智慧结束,当然,拥有包含实体的实体的实体肯定不是很难。

1 个答案:

答案 0 :(得分:0)

事实证明Visual Studio 2013是问题 - 它试图应用初始迁移,而不是实际的最新迁移(尽管已经应用了初始迁移)。我使用this answer来修复VS的迁移问题。