Пытались использовать ядро провайдера EF в памяти с .Net Dependency инъекцией.Модифицированный исходный документ пример, чтобы включить ядро .Net во встроенный, внедрение зависимостей.
Однако, удалив контекст и снова создав его, не смог получить объект обратно.Не могли бы вы указать мне в правильном направлении.
[TestMethod]
public void Find_searches_url()
{
var options = new DbContextOptionsBuilder<BloggingContext>()
.UseInMemoryDatabase(databaseName: "LkBlogs")
.Options;
ServiceCollection services = new ServiceCollection();
services.AddDbContext<BloggingContext>((y) => y.UseInMemoryDatabase(databaseName: "LkBlogs"), ServiceLifetime.Transient);
ServiceProvider serviceProvider = services.BuildServiceProvider();
using (var context = serviceProvider.GetService<BloggingContext>())
{
context.Blogs.Add(new Blog { Url = "http://sample.com/cats" });
context.Blogs.Add(new Blog { Url = "http://sample.com/catfish" });
context.Blogs.Add(new Blog { Url = "http://sample.com/dogs" });
context.SaveChanges();
var result = context.Blogs.Find(1);
Assert.IsNotNull(result, "From same context (which was used for writing, could not retrieve)");
}
using (var context = serviceProvider.GetService<BloggingContext>())
{
var result = context.Blogs.Find(1);
Assert.IsNotNull(result, "From new context, instantiated with DI could not retrieve");
}
using (var context = new BloggingContext(options))
{
var result = context.Blogs.FirstOrDefault();
//Error: Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException: 'Assert.IsNotNull failed. '
Assert.IsNotNull(result, "From new context, instantiated without DI could not retrieve");
}
}
РЕДАКТИРОВАТЬ: Пример документации:
[TestMethod]
public void Find_searches_url()
{
var options = new DbContextOptionsBuilder<BloggingContext>()
.UseInMemoryDatabase(databaseName: "Find_searches_url")
.Options;
// Insert seed data into the database using one instance of the context
using (var context = new BloggingContext(options))
{
context.Blogs.Add(new Blog { Url = "http://sample.com/cats" });
context.Blogs.Add(new Blog { Url = "http://sample.com/catfish" });
context.Blogs.Add(new Blog { Url = "http://sample.com/dogs" });
context.SaveChanges();
}
// Use a clean instance of the context to run the test
using (var context = new BloggingContext(options))
{
var service = new BlogService(context);
var result = service.Find("cat");
Assert.AreEqual(2, result.Count());
}
}
РЕДАКТИРОВАТЬ: 2 Испробовал все сроки службы, SingleTon, Transient & Scoped.Исключение остается тем же.
РЕДАКТИРОВАТЬ: 3 Согласно совету @Chris, удалено использование для Context.Не помогло:
[TestMethod]
public void Find_searches_url()
{
var options = new DbContextOptionsBuilder<BloggingContext>()
.UseInMemoryDatabase(databaseName: "LkBlogs")
.Options;
ServiceCollection services = new ServiceCollection();
services.AddDbContext<BloggingContext>((y) => y.UseInMemoryDatabase(databaseName: "LkBlogs"),
ServiceLifetime.Transient);
ServiceProvider serviceProvider = services.BuildServiceProvider();
var context = serviceProvider.GetService<BloggingContext>();
context.Blogs.Add(new Blog {Url = "http://sample.com/cats"});
context.Blogs.Add(new Blog {Url = "http://sample.com/catfish"});
context.Blogs.Add(new Blog {Url = "http://sample.com/dogs"});
context.SaveChanges();
var result = context.Blogs.Find(1);
Assert.IsNotNull(result, "From same context (which was used for writing, could not retrieve)");
var context2 = serviceProvider.GetService<BloggingContext>();
var result2 = context2.Blogs.Find(1);
Assert.IsNotNull(result2, "From new context, instantiated with DI could not retrieve");
var context3 = new BloggingContext(options);
var result3 = context3.Blogs.FirstOrDefault();
//Error: Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException: 'Assert.IsNotNull failed. '
Assert.IsNotNull(result3, "From new context, instantiated without DI could not retrieve");
}