0

这几天让我发疯。我正在使用 vs2012,EF5 代码,sql server 2012。这是在我的开发机器上,当并且仅当我第一次访问数据库时,我得到以下异常。如果在我运行测试之前初始化数据库,它会抛出以下异常,但此后不会。如果我运行我的测试,第一个测试会因为这个异常而失败,但我所有的其他测试都通过了。如果我捕捉到异常并忽略它,我的所有测试都会通过而不会出错. 令人沮丧的是,我在这两个表之间定义了约束,但不知道在哪里定义了“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 => 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);
4

1 回答 1

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);
      }
于 2013-05-18T23:10:33.070 回答