我首先使用的是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);
}
我做错了什么?我也尝试使用复合主键(因此复合外键),但这仍然给我同样的错误。我真的是在我的智慧结束,当然,拥有包含实体的实体的实体肯定不是很难。
答案 0 :(得分:0)
事实证明Visual Studio 2013是问题 - 它试图应用初始迁移,而不是实际的最新迁移(尽管已经应用了初始迁移)。我使用this answer来修复VS的迁移问题。