这让我疯狂了好几天。我首先使用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);
答案 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);
}