【发布时间】:2015-12-18 04:54:19
【问题描述】:
在应用程序 ASPNET WebApi 中,我们使用 SimpleInjector 作为 IOC 和 EF6 Code First,问题是更新对象时,EF 没有意识到这是相同的并尝试再次创建它。
从浏览器运行它时运行正常,但是当我们从集成测试运行它时,需要定义一个混合上下文,因为我们在 IoC 中使用的 LifeStyle 是通过请求,而测试是 Scope。
这就是我们定义混合上下文的方式。
Container.Options.DefaultScopedLifestyle = Lifestyle.CreateHybrid(
() => Container.GetCurrentExecutionContextScope() != null,
new ExecutionContextScopeLifestyle(),
new WebApiRequestLifestyle());
IocConfig.RegisterIoc(new HttpConfiguration(), Container);
然后我们必须运行 [AssemblyInitialize] 中定义的测试,它负责在数据库中创建初始测试数据。
对于每个单独的测试
[TestMethod, TestCategory("Nightly")][Ignore]
public void SearchLogsOrdersCorrectlyTest()
{
using (GlobalInit.Container.BeginExecutionContextScope())
{
var subscriptionService = GlobalInit.Container.GetInstance<ISubscriptionService>();
var subscriptionBaseModel = new SubscriptionBaseModel
{
AuditInformation = new AuditModel
{
UserName = "User Name",
UserEmail = "username@domain.com",
UserHostname = "manage.domain.com",
UserIpAddress = "11.11.11.11"
},
Company = new Company { Id = 1 },
Customers = new List<Customer>
{
new Customer
{
Email = "email@dom.com",
FullName = "Full Name"
}
},
SubscriptionData = new SubscriptionPlanUpdateModel
{
AvailableLicenses = 1,
ContractId = "1111",
Url = "http://google.com ",
SubscriptionComments = ".",
ExpirationDate = DateTime.Today.AddYears(1)
}
};
var subscriptionCreationModel = mappingEngine.Map<SubscriptionCreationModel>(subscriptionBaseModel);
subscriptionCreationModel.Validate();
Assert.IsTrue(subscriptionCreationModel.IsModelValid);
var newSubscription = SubscriptionFactory.GetSubscription(subscriptionCreationModel);
var savedSubscription = newSubscription.Save();
Assert.IsNotNull(savedSubscription);
}
}
基本上,测试所做的就是获取一个带有基本数据的模型,从数据库中添加数据,然后保存它。问题是它试图将对象作为新对象插入数据库而不是更新它们。这似乎是因为它理解它们来自不同的上下文。
如果我们不使用GlobalInit.Container.BeginExecutionContextScope(),那么我们会得到一个异常,即 Scope 不同并且无法在 Web 上下文之外启动 WebRequestScope。
这里的特点是所有这些都是在以下范围内完成的:
using (GlobalInit.Container.BeginExecutionContextScope())
因此,如果您知道我们在这里输了,我们将不胜感激。
【问题讨论】:
-
你确定这行OK : Company = new Company { Id = 1 } 吗? ,这将创建一个所有时间都为 1 的新公司
-
是的,这很好,因为当我调用 SubscriptionFactory.GetSubscription() 时,我使用公司 ID 从数据库中检索公司。这正是问题所在,因为当我尝试保存模型时,我遇到了一个异常,表明公司已经存在
标签: entity-framework entity-framework-6 simple-injector