在软件开发中,数据库是不可或缺的一部分。随着技术的发展,Entity Framework(EF)作为.NET平台的ORM(对象关系映射)工具,已经发展到了第七代。EF 7引入了In-Memory Database支持,这意味着开发者可以在不连接真实数据库的情况下进行开发和测试。本文将介绍如何使用EF 7的In-Memory Database功能来开发一个小型项目,以帮助一位行政人员提高日常工作的效率。
项目的目标是为一位行政人员创建一个辅助工具,以简化其日常工作流程。这个工具将涉及到数据库操作,因此需要选择一个合适的技术栈。考虑到项目规模较小,决定使用Owin和ASP.NET MVC 5作为后端框架,并使用Aurelia.IO进行前端开发。对于数据库,决定尝试EF 7的In-Memory Database功能。
首先,需要安装EntityFramework.InMemory NuGet包。这可以通过Visual Studio 2015的NuGet包管理器轻松完成。需要注意的是,由于使用的是预发布版本,因此需要在NuGet配置中启用预发布包的安装。
接下来,需要定义一些模型类。在这个例子中,定义了两个类:Person和Qualification。
public class Person
{
    public Person()
    {
        Qualifications = new List<Qualification>();
    }
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public ICollection<Qualification> Qualifications { get; set; }
    public override string ToString()
    {
        string qualifications = Qualifications.Any() ?
            Qualifications.Select(x => x.Description)
                .Aggregate((x, y) => string.Format("{0} {1}", x, y)) :
            string.Empty;
        return string.Format("Id : {0}, FirstName : {1}, LastName : {2}, \r\nQualifications : {3}\r\n",
            Id, FirstName, LastName, qualifications);
    }
}
public class Qualification
{
    public int Id { get; set; }
    public string Description { get; set; }
    public override string ToString()
    {
        return string.Format("Id : {0}, Description : {1}", Id, Description);
    }
}
    
定义好模型类后,需要创建一个DbContext来管理这些模型。这个过程相对简单,只需要继承DbContext类并定义DbSet属性。
public class ClassDbContext : DbContext
{
    public ClassDbContext(DbContextOptions options) : base(options)
    {
    }
    public DbSet<Person> Members { get; set; }
    public DbSet<Qualification> Qualifications { get; set; }
}
    
class Program
{
    static void Main(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<ClassDbContext>();
        optionsBuilder.UseInMemoryDatabase();
        using (var classDbContext = new ClassDbContext(optionsBuilder.Options))
        {
            SeedData(classDbContext);
            var personId1 = GetMember(classDbContext, 1);
            Console.WriteLine("> Adding a qualification\r\n");
            personId1.Qualifications.Add(classDbContext.Qualifications.First());
            classDbContext.SaveChanges();
            personId1 = GetMember(classDbContext, 1);
            Console.ReadLine(); 
        }
    }
    private static Person GetMember(ClassDbContext classDbContext, int id)
    {
        var person = classDbContext.Members.FirstOrDefault(x => x.Id == id);
        Console.WriteLine(person);
        return person;
    }
    private static void SeedData(ClassDbContext classDbContext)
    {
        classDbContext.Members.Add(new Person()
        {
            Id = 1,
            FirstName = "Sacha",
            LastName = "Barber"
        });
        classDbContext.Members.Add(new Person()
        {
            Id = 2,
            FirstName = "Sarah",
            LastName = "Barber"
        });
        classDbContext.Qualifications.Add(new Qualification()
        {
            Id = 1,
            Description = "Bsc Hons : Computer Science"
        });
        classDbContext.Qualifications.Add(new Qualification()
        {
            Id = 2,
            Description = "Msc : Computer Science"
        });
        classDbContext.Qualifications.Add(new Qualification()
        {
            Id = 3,
            Description = "Bsc Hons : Naturapathic medicine"
        });
        classDbContext.SaveChanges();
    }
}