我正在使用Entity Framework 5进行迁移。我的模型看起来像这样:
UserRegistration
Sessions
每次注册都可以有很多会话。尝试运行迁移时,我遇到了SQL级联删除错误的问题,因此我尝试通过添加以下代码来删除级联删除:
modelBuilder.Entity<UserRegistration>()
.HasOptional(x => x.Sessions)
.WithMany()
.WillCascadeOnDelete(false);
现在,如果你知道EF,你可以看到该代码的错误。我认为这给了我一个从UserRegistrations到Sessions的1对多关系,实际上这段代码说“每个UserRegistration都有一个可选的Session,每个Session都有很多UserRegistrations”。所以我的一对多关系走错了方向。我相信这应该是我添加的代码。
modelBuilder.Entity<UserRegistration>()
.HasMany(x => x.Sessions)
.WithRequired(x => x.UserRegistration)
.WillCascadeOnDelete(false);
但是,当我删除坏代码(上面的第一个块)并运行add-migration时,我得到了这个:
public override void Up()
{
DropForeignKey("dbo.UserRegistrations", "Sessions_Id", "dbo.UserRegistrationSessions");
DropIndex("dbo.UserRegistrations", new[] { "Sessions_Id" });
RenameColumn(table: "dbo.UserRegistrationSessions", name: "Sessions_Id", newName: "UserRegistration_Id");
}
前两行(DropForeignKey和DropIndex)看起来不错,这是从UserRegistrations表中删除外键。然而,第3行无处不在。 UserRegistrationSessions表中没有Sessions_Id列。当我运行它时,我预计会出错:
Either the parameter @objname is ambiguous or the claimed @objtype (COLUMN) is wrong.
我在想我的模型和我的模型构建器代码之间的问题。也许我需要尝试让我的模型看起来不正确,但匹配模型构建器代码,然后继续修复。
以下是我模型中的相关代码:
public class UserRegistration
{
public int Id { get; set; }
public virtual ICollection<UserRegistrationSession> Sessions { get; set; }
}
public class UserRegistrationSession
{
public int Id { get; set; }
public virtual UserRegistration UserRegistration { get; set; }
}
答案 0 :(得分:0)
这更像是对评论中问题的回答,即“实体框架从何处获取信息”。答案可能是附加到迁移的资源文件中模型的序列化版本。
如果尚未在野外部署迁移,是否可以在创建迁移之前删除有问题的迁移并将数据库回滚到其中?