MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 二

时间:2023-12-06 12:13:38

本次改动的主要内容是实现MongoDB.Repository对MongoDBRef的支持。

MongoDB对一对一,一对多,多对多关系的维护,官方推荐文档嵌入方式,反映到模型的设计如下:

    public class Student : Entity
{
public string Name { get; set; }
public int Age { get; set; }
} public class Teacher : Entity
{
public string Name { get; set; }
public int Age { get; set; }
} public class Grade : RefEntity
{
public string Name { get; set; }
}
public class School : Entity
{
public string Name { get; set; }
public List<MongoDBRef> Students { get; set; }
public List<MongoDBRef> Teachers { get; set; }
public MongoDBRef Master { get; set; }
}

该种设计在数据库中的存储格式如下图:

aaarticlea/png;base64,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" alt="" />

其中的Students, Teachers, Master都以嵌入在School集合中,而在相应的Student,Teacher集合中,并没有相关的数据。

如果是多学校,我们要查询系统中所有的学生,或老师,那将是一件非常费力的工作。而我们最终目的应该是在School中存储键值,应该使用MongoDBRef实现,如下:

    public class School : Entity
{
public string Name { get; set; }
public List<MongoDBRef> Students { get; set; }
public List<MongoDBRef> Teachers { get; set; }
public MongoDBRef Master { get; set; }
}

而这种设计,MongoDBRef的数据结构则过于简单,只有Id, CollectionName,DatabaseName三个字段,如果要得到Master,只能去Teacher集合中再次执行查询操作。

而本次提交,解决的正是这个问题,使代码可以写成如school.Pick<Student>(student.Id).Name的形式。

主要接口:IRefEntity,IDBRefContainer。

IRefEntity:为减少数据冗余,并提供一个Update方法。Update方法的逻辑是先保存当前实体,即执行IEntity.Save(),然后对DBRefs中的数据进行保存,接口定义如下:

    public interface IRefEntity : IEntity
{
/// <summary>
/// list of MongoDBRef
/// </summary>
List<MongoDBRef> DBRefs { get; set; } /// <summary>
/// save IEntity first, then save list of MongoDBRef
/// </summary>
void Update();
}

IDBRefContainer接口,为IRefEntity.DBRefs的数据提供一个对应的实体容器,已完成相应的查询、添加、删除操作,接口定义如下:

    public interface IDBRefContainer
{
bool Exists(string id);
bool Exists<T>() where T : IEntity;
bool Exists<T>(Predicate<T> match) where T : IEntity; T Pick<T>(string id) where T : IEntity;
T Pick<T>(Expression<Func<T, bool>> where) where T : IEntity; List<T> GetAll<T>() where T : IEntity;
List<T> GetMany<T>(Expression<Func<T, bool>> where) where T : IEntity; void Add<T>(T entity) where T : IEntity;
void Add<T>(List<T> entities) where T : IEntity; int Remove<T>(Expression<Func<T, bool>> where) where T : IEntity;
void Remove<T>(T entity) where T : IEntity;
void Remove<T>() where T : IEntity; int Count<T>() where T : IEntity;
int Count<T>(Expression<Func<T, bool>> where) where T : IEntity; List<IEntity> GetAll();
}

需要注意的是,尽量使用IEntity.Save()进行保存操作,而减少使用IDBRefEntity.Update()进行更新保存 操作,因为IDBRefEntity.Update()针对的是所有IDBRefContainer中的数据,其执行效率还有待改善和提高。本人也一直在纠结,这个IDBRefEntity.Update()是否需要或者是否应该提供。

下面给出一个具体的测试用例:

        [TestCase]
public void test()
{
grade = new Grade();
grade.Name = "No1";
foreach (Student student in students)
grade.Add<Student>(student);
foreach (Teacher teacher in teachers)
grade.Add<Teacher>(teacher);
grade.Update(); students[].Name = "NameChanged";
students[].Save(); var g = MongoEntity.Get<Grade>(grade.Id); Assert.AreSame(students[].Name, grade.Pick<Student>(students[].Id).Name);
Assert.AreNotSame(grade.Pick<Student>(students[].Id).Name, g.Pick<Student>(students[].Id).Name);
Assert.AreEqual(grade.Count<Student>(), g.Count<Student>());
Assert.AreEqual(grade.Count<Teacher>(), g.Count<Teacher>());
}

具体请参考源码

本人深感能力不足,欢迎大家指正、指教。