如何设置一些属性来自遗留源的模型

本文关键字:模型 属性 何设置 设置 | 更新日期: 2023-09-27 18:12:45

当数据模型的一些属性来自各种遗留源时,建立实体框架数据模型的最佳实践方法是什么?

例如:

假设你正在创建一个新的员工管理门户,所以我们想要一个员工实体,像FirstName, LastName, JobTitle等东西作为存储在门户数据库中的新属性(我们不介意EF是否在第一次运行时创建)

但是,假设Employee的一些其他属性来自外部遗留源,例如:
  • 假设当前的休假时间来自一个已经存在的不同数据库,并且我们没有权限使用EF monkey(尽管我们允许EF更新值)
  • 假设当前健康计划信息来自一个我们根本没有写访问权限的web服务。

是否有一种方法来设置实体框架,这样我们就可以抓住一个雇员实体,并有它填充这些外部来源的属性?

子问题:是否有一种方法可以让EF接口与不同的数据库和表的特定属性?(例如假期时间属性?)

如何设置一些属性来自遗留源的模型

每个工具都有它的作用范围。这超出了EF的范围。EF在数据存储方面是完全一夫一妻制的。一个上下文,一个存储。我们可以发明一些创造性的技巧来绕过这个限制,但结果将小于各部分的总和。

例如,ObjectContext(可通过DbContext访问)有一个ObjectMaterialized事件:

当作为查询或加载操作的一部分从数据源中的数据创建新的实体对象时发生。

可以使用此事件来捕获Employee对象的物化。然后,在创建新对象时,调用其他数据源来填充剩余的属性。这将是一个数据库调用(通过另一个EF上下文,因为它是一个不同的数据库)和一个针对对象的web服务调用。性能下降了。

同样地,可以覆盖SaveChanges并将"异形"属性保存到其他存储。但这又会降低性能。(尽管在这里您可以一次处理一组完整的员工)。

这通常是您在访问各种数据源并编排其操作的服务中所做的事情。例如,从门户数据库中获取Employee对象,立即获取所需的所有项,然后访问其他源以填充其他属性。您可能希望将这些属性添加到Employee中作为未映射的属性,或者使用某种从单独的数据源填充的"规范"雇员类。

首先,确保有一个表可以存储您想要存储的所有数据,包括从其他来源获得的数据,如休假时间和健康计划信息。

如果您已经这样做了,那么在您的业务逻辑层中创建一个POCO(普通的"CLR对象")类,其中包含与您的EF实体对象匹配的属性名,如下所示:

public class Employee
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string JobTitle { get; set; }
        public int VacationTime { get; set; }
        public string HealthPlanName { get; set; }
    } 

然后,在您从这些其他来源获取数据的代码中,您将需要创建一个新的Employee对象,分配从其他来源获得的值,并使用EF将其持久化,如下所示:

var newEmployee = new Employee {
            FirstName = "somename",
            LastName = "somelastname",
            JobTitle = "somejobtitle",
            VacationTime = someservice.VacationTime,
            HealthPlanName = someotherservice.HealthPlanName
           };
        db.Employees.Add(newEmployee);
        db.SaveChanges();

当然,这是非常简单的,但希望它给你一个想法,如何完成你需要的。您需要添加到Employee实体中的一些数据来自不同的来源,这一事实不应该改变您使用EF持久化它的方式。