EF5,仅在第一次数据库访问时代码第一个异常:“FK_x ... x'不是约束。无法删除约束”

时间:2013-05-18 15:10:41

标签: visual-studio-2012 ef-code-first entity-framework-5 code-first

这让我疯狂了好几天。我首先使用vs2012,EF5代码,sql server 2012.这是在我的开发机器上和 我得到以下异常时,只有当我第一次点击数据库时 < / strong>即可。如果,在我运行测试之前,我初始化数据库,它会抛出以下异常,但之后不会。如果我运行我的测试,第一次测试失败是因为这个例外,但我的所有其他测试都通过了。如果我捕获异常并忽略它,我的所有测试都会毫无错误地通过。令人沮丧的是,我在这两个表之间定义了约束,但不知道'Users_Id'的定义位置。我也尝试手动删除表并从我的DbContext运行vs2012生成的sql来重新创建表,但没有任何作用。任何帮助将不胜感激。

以下是例外

* System.Data.SqlClient.SqlException:'FK_dbo.UserProfiles_dbo.Users_Id'不是约束。 无法删除约束。请参阅先前的错误。*

以下是我的pocos

用户

public class User : Entity<User>, IUser
   {
      public Guid Id { get; set; }
      // Nav property to UserProfile.
      public virtual UserProfile UserProfile { get; set; }
      public Guid SiteId { get; set; }
      public virtual Site Site { get; set; }
   }

用户配置

public class UserProfile : Entity<UserProfile>, IUserProfile
   {
      // Points to User.Id
      public Guid Id { get; set; }
      // Nav property back to user.
      public virtual User User { get; set; }
   }

这是我的代码第一次定义两个表(其他代码为了简洁而省略):

编辑:两个表之间的关系是Id User.Id =&gt; UserProfile.Id

用户

modelBuilder.Entity<User>().HasKey(p => p.Id);
         modelBuilder.Entity<User>().HasRequired(p => p.Site).WithMany(p => p.Users).HasForeignKey(p => p.SiteId);
         modelBuilder.Entity<User>()
                   .HasRequired(p => p.UserProfile)
                   .WithRequiredPrincipal(p => p.User)
                   .WillCascadeOnDelete(true);

用户配置

modelBuilder.Entity<UserProfile>().HasKey(p => p.Id);
         modelBuilder.Entity<UserProfile>().HasRequired(p => p.User);

1 个答案:

答案 0 :(得分:0)

修正了

在我的DbContext

protected override void OnModelCreating(DbModelBuilder modelBuilder)
      {
         Database.SetInitializer(new MigrateDatabaseToLatestVersion<Context, ContextConfiguration>());

         base.OnModelCreating(modelBuilder);
      }

我的迁移配置

public class ContextConfiguration : DbMigrationsConfiguration<Context>
   {
      public ContextConfiguration()
      {
         this.AutomaticMigrationsEnabled = true;
         this.AutomaticMigrationDataLossAllowed = true;
      }
   }

在我的测试中

[TestInitialize]
      public override void TestInitialize()
      {
         // Force model updates.
         using (var uow = UnitOfWorkFactory.Instance.Create<UnitOfWorkCore>(DefaultConnectionString))
         {
            uow.Database.Initialize(force: false);
         }

         // begin transaction
         this.transactionScope = new TransactionScope();

         this.unitOfWork = UnitOfWorkFactory.Instance.Create<UnitOfWorkCore>(DefaultConnectionString);
      }

我改变了这一点而不是没有问题 * 我改变了这一点而不是没有问题 * 我改变了这一点而不是没有问题

在我的测试中

[TestInitialize]
      public override void TestInitialize()
      {
         // Force model updates.

         // I CHANGED TO THIS:
         Database.SetInitializer(new DropCreateDatabaseAlways<Context>());

         using (var uow = UnitOfWorkFactory.Instance.Create<UnitOfWorkCore>(DefaultConnectionString))
         {
            uow.Database.Initialize(force: false);
         }

         // begin transaction
         this.transactionScope = new TransactionScope();

         this.unitOfWork = UnitOfWorkFactory.Instance.Create<UnitOfWorkCore>(DefaultConnectionString);
      }