我在使用内存数据库对 EF 7 进行单元测试时遇到问题。以下应用程序将演示该问题。
using System;
using Microsoft.Data.Entity;
using Microsoft.Data.Entity.Infrastructure;
namespace EF7InMemoryBug
{
public class Program
{
public static void Main(string[] args)
{
Program p = new Program();
MembershipContext m1 = p.GetNewContext();
MembershipContext m2 = p.GetNewContext();
foreach (var member in m1.Members)
{
Console.WriteLine(member);
}
}
private MembershipContext GetNewContext()
{
var optionsBuilder =
new DbContextOptionsBuilder<MembershipContext>();
optionsBuilder.UseInMemoryDatabase();
MembershipContext context = new MembershipContext(optionsBuilder.Options);
Member member1 = new Member()
{
MemberId = 1,
FirstName = "James",
LastName = "Jones"
};
context.Members.Add(member1);
context.SaveChanges();
return context;
}
}
public class Member
{
public int MemberId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public override string ToString()
{
return $"{MemberId} {FirstName} {LastName}";
}
}
public class MembershipContext : DbContext
{
public MembershipContext(DbContextOptions options)
: base(options) {}
public DbSet<Member> Members { get; set; }
}
}
调用 MembershipContext m2 = p.GetNewContext();
后,context.SaveChanges()
抛出异常。
An exception of type 'System.ArgumentException' occurred in EntityFramework.Core.dll but was not handled in user code
Additional information: An element with the same key but a different value already exists. Key: Microsoft.Data.Entity.ChangeTracking.Internal.SimpleKeyValue`1[System.Int32]
我知道发生了什么,但我不知道为什么。
当第二次调用 MembershipContext context = new MembershipContext(optionsBuilder.Options);
时,创建了上下文,但是 context.Members
已经有了来 self 第一次创建上下文,因此出现异常。
最佳答案
这不是错误,这是一个功能。 https://github.com/aspnet/EntityFramework.Docs/issues/95
这是使用 DI 的建议方法。
using System;
using Microsoft.Data.Entity;
using Microsoft.Data.Entity.Infrastructure;
using Microsoft.Extensions.DependencyInjection;
namespace EF7InMemoryBug
{
public class Program
{
public static void Main(string[] args)
{
Program p = new Program();
MembershipContext m1 = p.GetNewContext();
MembershipContext m2 = p.GetNewContext();
foreach (var member in m1.Members)
{
Console.WriteLine(member);
}
foreach (var member in m2.Members)
{
Console.WriteLine(member);
}
}
private MembershipContext GetNewContext()
{
var serviceCollection = new ServiceCollection();
serviceCollection
.AddEntityFramework()
.AddInMemoryDatabase()
.AddDbContext<MembershipContext>(c => c.UseInMemoryDatabase());
MembershipContext context = serviceCollection.BuildServiceProvider().GetService<MembershipContext>();
Member member1 = new Member()
{
MemberId = 1,
FirstName = "James",
LastName = "Jones"
};
context.Members.Add(member1);
context.SaveChanges();
return context;
}
}
public class Member
{
public int MemberId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public override string ToString()
{
return $"{MemberId} {FirstName} {LastName}";
}
}
public class MembershipContext : DbContext
{
public MembershipContext(DbContextOptions options)
: base(options) {}
public DbSet<Member> Members { get; set; }
}
}
关于c# - Entity Framework 7 内存数据库异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34906071/