c# - Entity Framework 7 内存数据库异常

标签 c# entity-framework-core

我在使用内存数据库对 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/

相关文章:

c# - 加入具有一对多关系的两个表并从多个方面选择最新的

LINQ to SQL - 无法翻译 null 的表达式检查

c# - 通过反射获取接口(interface)类型的构造函数,有没有比遍历类型更好的方法?

c# - CommandBar 在 Windows 10 通用应用程序的纵向模式下始终可见

C#:如何处理乱序的TCP数据包?

c# - EF Core HasQueryFilter 仅适用于过滤器表达式中的第一个值

.net-core - Entity Framework Core 无法使用子对象和 GUID 创建种子

c# - 如何将已经显示的表单置于最前面并使其聚焦?

c# - 获取有关 WCF 中需要很长时间的方法的进度信息的有效模式?

c# - 在 Startup 中将 ApplicationDbContext 注入(inject)到 Configure 方法中