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

时间:2012-03-18 17:04:00

标签: 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; }

    ...
}

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

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

1 个答案:

答案 0 :(得分: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);
}

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

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

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; }
}