MongoDB和SQL Server的统一数据访问层

Ser*_*kin 4 entity-framework mongodb-.net-driver

我们的ASP.NET MVC项目同时使用MS SQL Server(对于大多数数据)和MongoDB(最不重要的东西,如审计日志,内部消息系统,通知等).所以问题是数据访问层架构在我的案例中应该是什么样的?我们使用Entity Framework POCO生成器来访问SQL Server,因为单元测试很重要,理想情况下我更喜欢扩展Entity Framework生成的IEntities接口,以便业务逻辑和UI开发人员甚至不知道实际对象的存储位置:

[GeneratedCode("Entity","0.9")]
public partial interface IEntities
{
    IObjectSet<Administrator> Administrators { get; }
    IObjectSet<User> Users { get; }
    IObjectSet<Banner> Banners { get; }
    IObjectSet<AuditLog> AuditLogs { get; }

    ...
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,只有AuditLog实体存储在MongoDB中,而其余实体通过SQL Server工作.

到目前为止,我所拥有的最佳解决方案是在MongoDB C#驱动程序之上实现一个IObjectSet <T>接口,MongoRepository(http://mongorepository.codeplex.com/)项目是我的问题的一半解决方案.有谁知道更好的方法?

Jon*_*ora 5

MongoRepository的问题是您的实体必须从其Entity基类派生或在每个POCO中实现IEntity.我正在开发一个名为"MongoDB.Dynamic"的独立项目,该项目将与POCO实体框架类兼容.使用MongoDB.Dynamic将允许您只使用接口来保存数据.

[TestInitialize]
public void Initialize()
{
    Dynamic.Config.SetKeyName<ICustomer>(c => c.Id);
    Dynamic.Config.SetKeyName<IOrder>(o => o.Id);
    Dynamic.Config.LoadCollection<ICustomer, IOrder>(customer => customer.Orders, order => order.IdCustomer);
    Dynamic.Config.LoadFK<IOrder, ICustomer>(order => order.Customer, order => order.IdCustomer);
    var customers = Dynamic.GetCollection<ICustomer>();
    var orders = Dynamic.GetCollection<IOrder>();
    customers.RemoveAll(true);
    orders.RemoveAll(true);
}

[TestMethod]
public void TestLoadOrderByCustomerAuto()
{
    var customers = Dynamic.GetCollection<ICustomer>();
    var orders = Dynamic.GetCollection<IOrder>();

    var cust = customers.New();
    cust.Name = "X";
    customers.Upsert(cust);

    var check = customers.GetFirstOrDefault();

    var o1 = orders.New();
    o1.IdCustomer = check.Id;
    orders.Upsert(o1);

    var o2 = orders.New();
    o2.IdCustomer = check.Id;
    orders.Upsert(o2);

    var verify = customers.GetFirstOrDefault();

    Assert.IsNotNull(verify.Orders);
    Assert.IsTrue(verify.Orders.Count() == 2);
}
Run Code Online (Sandbox Code Playgroud)

几天后,我将发布这个项目.迫不及待地想与社区分享.

编辑:上面代码引用的接口:

public interface ICustomer
{
    int Id { get; set; }
    string Name { get; set; }

    IEnumerable<IOrder> Orders { get; set; }
}

public interface IOrder
{
    int Id { get; set; }
    int IdCustomer { get; set; }

    ICustomer Customer { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

  • [MongoDB.Dynamic]有一些doc和nuget包(http://www.assembla.com/spaces/mongodb-dynamic/wiki) (2认同)