我正在尝试在我的应用程序中实现业务层。原因是我的(遗留)数据库对于我们的用例非常复杂。所以我要做的是以下
这非常适合检索对象,但更新它们会让我一直遇到问题。让我先给你(一些)我的代码(稍微简化): 使用System;
/* The datamodel*/
public class DataModel
{
[Key]
public int Id { get; set; }
public double InterestRate { get; set; }
}
/*The business model */
public class BusinessModel
{
public int Id { get; set; }
public double InterestRate { get; set; }
public bool IsHighInterest()
{
return InterestRate > 10;
}
}
public class MyDbContext : DbContext
{
public MyDbContext() : base("connectionstring")
{
}
public DbSet<DataModel> DataModels { get; set; }
}
/* In reality I've got a repository here with a unit-of-work object instead of accessing the DbContext directly. */
public class BusinessLayer
{
public BusinessModel Get(int id)
{
using (var context = new MyDbContext())
{
var dataModel = context.DataModels.FirstOrDefault(x => x.Id == id);
BusinessModel = Transform(dataModel); //Do a transformation here
}
}
public void Update(BusinessModel model)
{
using (var context = new MyDbContext())
{
var dataModel = TransformBack(dataModel);
context.Entry<dataModel>.State = System.Data.Entity.EntityState.Modified;
context.SaveChanges();
}
}
}
显然这不会起作用,因为实体框架无法再跟踪数据模型的变化。我正在寻找一种可以做这些事情的设计模式。希望你们中的任何人都可以帮助我。实际上,数据模型更复杂,而BusinessModel简化了很多,所以只使用DataModel也不是一个选项。
答案 0 :(得分:2)
那基本上是ViewModel pattern.虽然你当然可以添加一个存储库但请记住实体框架已经实现了工作单元,但我离题了。我们中的许多人使用POCO实体模型与您的代码非常相似地与数据库进行交互,然后将这些模型转换为ViewModels,DTO或称为Business Models。 Automapper对此非常有用。
所以在我的更新代码中我做了类似这样的事情(MVC):
if (ModelState.IsValid)
{
var entity = context.Entities.First(e => e.Id == viewmodel.Id); // fetch the entity
Mapper.Map(viewmodel, entity); // Use automapper to replace changed data
context.SaveChanges();
}
如果你有权访问Pluralsight,这里有一个关于这个主题的好视频:https://wildermuth.com/2015/07/22/Mapping_Between_Entities_and_View_Models