我们的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/)项目是我的问题的一半准备解决方案。有谁知道更好的方法?
答案 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; }
}