MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 五 --- 为List<MongoDBRef>增加扩展方法...

本文详细介绍了在MongoDB.Repository中为List<MongoDBRef>增加扩展方法的原因及实现过程,旨在解决单一List<MongoDBRef>无法满足复杂实体设计需求的问题。通过在实体子类中直接定义List<MongoDBRef>Receiver和List<MongoDBRef>Friends,文章展示了如何更好地管理实体间的引用关系,包括实例创建、保存、查询等操作,并探讨了IRefEntity接口未来的可能废弃。此外,提供了具体代码示例来说明如何进行相关操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本次改动主要内容:为List<MongoDBRef>增加扩展方法

在MongoDB.Repository的使用过程中,发现在一个类中只定义一个List<MongoDBRef>是不够用的,即IRefEntity和IDBRefContainer两个接口并不能满足实体设计的需要。在很多时候,我们需要有多个List<MongoDBRef>,而原IRefEntity接口中只定义了一个List<MongoDBRef>。实际情况如 我们定义一个用户类Customer,这个用户可以发送和接收消息,且该用户也有好友,消息接收人和好友都是Customer类型。此时IRefEntity接口将无可奈何。改动即针对这种情况提出解决方案。

在Entity的子类中直接定义List<MongoDBRef> Receiver和List<MongoDBRef> Friends,放弃使用IRefEntity接口。本人也正在考虑IRefEntity接口是否将在后续的版本中废除。定义代码如:

    public class Teacher : Entity
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

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

对List<MongoDBRef> Teachers的相应操作如下:

        [TestCase]
        public void Test()
        {
            Grade grade = new Grade() { Name = "Grade1"};
            foreach (var teacher in teachers)
            {
                teacher.Save();
                grade.Teachers.Add(teacher.ToDBRef());
            }
            grade.Save();
            var teach = grade.Teachers.RefPick<Teacher>(teachers[0].Id);
            var ts = grade.Teachers.RefPick<Teacher>(t => t.Age >= 50);
            Assert.AreEqual(2, ts.Count);
            Assert.AreEqual(teach.Id, teachers[0].Id);
            Assert.AreEqual(teach.Name, teachers[0].Name);
        }

除RefPick<T>()外,并有RefExists<T>()方法配合,已完成对List<MongoDBRef>属性的操作。

目前保持IRefEntity接口不变,后续版本可能会删除该接口,因为其存在的意义不大了。

源码

 

 

转载于:https://www.cnblogs.com/winhu/p/3429836.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值