首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用业务模型更新实体框架

使用业务模型更新实体框架
EN

Stack Overflow用户
提问于 2016-05-26 12:10:00
回答 1查看 603关注 0票数 1

我正在尝试在我的应用程序中实现业务层。原因是我的(遗留)数据库对于我们所拥有的用例来说非常复杂。所以我想做的是

  1. 从DbContext检索数据模型
  2. 将数据模型转换为业务模型
  3. 把它传给我的控制器用。

这对于检索对象非常有效,但是更新对象会给我带来问题。让我先给你(一些)我的代码(有点简化):使用系统;

代码语言:javascript
复制
/* 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也不是一种选择。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-26 13:10:37

这本质上是一个ViewModel模式,当然您可以添加一个存储库,记住实体框架已经实现了工作单元,但我偏离了主题。我们中的许多人使用POCO实体模型与数据库进行交互,然后将这些模型转换为ViewModels、DTO或称为业务模型,这与您的代码非常相似。自动机在这方面做得很好。

因此,在我的更新代码中,我做了这样的事情(MVC):

代码语言:javascript
复制
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,这里有一个很好的主题视频:模型

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37460469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档