Как включить свойства объекта в EntityFrameworkCore InMemory
Я хочу протестировать DbContext с EntityFramework.InMemory, но когда я пытаюсь включить все свойства объектов, они становятся нулевыми, и я действительно не знаю почему.
У меня есть UnitOfWorkLocator, который отвечает за создание и возврат одного и того же UnitOfWork.
public static class UnitOfWorkLocator
{
public static Func<UnitOfWork> UnitOfWorkFactory;
public static UnitOfWork GetUnitOfWork()
{
return UnitOfWorkFactory();
}
}
Так что в каждом тестовом классе я делаю что-то вроде этого:
contextOptions = new DbContextOptionsBuilder<SchoolLibraryContext>()
.UseInMemoryDatabase(Guid.NewGuid().ToString())
.Options;
UnitOfWorkLocator.UnitOfWorkFactory = () => new UnitOfWork(contextOptions);
LendedBook:
public class LendedBook: EntityBase
{
public virtual Book Book
{
get;
set;
}
public virtual Student Student
{
get;
set;
}
public virtual DateInterval DateInterval
{
get;
set;
}
public bool Returned
{
get;
set;
}
public bool Canceled
{
get;
set;
}
}
Метод из репозитория:
public LendedBook GetLendedBookById(Guid lendedBookId)
{
return schoolLibraryContext.LendedBooks.Include(book => book.Book)
.Include(student => student.Student)
.Include(dateInterval => dateInterval.DateInterval)
.FirstOrDefault(lendedBook => lendedBook.Id == lendedBookId) ??
throw new EntityNotFoundException(typeof(LendedBook).Name);
}
Класс EntityBase отвечает за сохранение сущности в базе данных с помощью этого метода:
public void Save()
{
using (var unitOfWork = UnitOfWorkLocator.GetUnitOfWork())
{
unitOfWork.AddOrUpdate(this);
unitOfWork.Commit();
}
}
И EntityBase также имеет свойство Id:
public Guid Id { get; set; }
Инициализация и метод Save, выполненные в LendedBook:
var student = new Student("Sebastian", "Odegrad")
{
Email = "email@domain.com"
};
var dateInterval = new DateInterval
{
StartDate = new DateTime(2018, 08, 01),
EndDate = new DateTime(2018, 08, 30)
};
var lendedBook = new LendedBook
{
Student = student,
DateInterval = dateInterval
};
libranian = new Libranian("Wilskinson", "Martin");
student.Save();
dateInterval.Save();
lendedBook.Save();
Итак, как я могу правильно включить все свойства объекта с EFCore.InMemory?
1 ответ
Я нашел одно решение:
Я изменил параметр из конструктора UnitOfWork, чтобы принимать DbContext вместо DbContextOptions. Также я удалил метод Save() из EntityBase и создал AddLendedBook в LendedBookRepository. Я думаю, что этот подход намного более чистый и проверяемый.