如何设置某些属性来自旧版源的模型

时间:2014-07-11 20:06:31

标签: c# entity-framework

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

例如:

假设您正在创建一个新的员工管理门户,因此我们需要一个Employee实体,其中包括FirstName,LastName,JobTitle等等,这些新属性存储在门户网站的数据库中(我们不介意EF在第一次运行时创建)

但是,说雇员的其他一些属性来自外部遗留来源,例如:

  • 假设当前休假时间来自已存在的其他数据库,我们无权拥有EF Monkey(尽管我们允许EF更新值)
  • 假设当前的健康计划信息来自我们根本没有写访问权限的Web服务。

有没有办法设置实体框架,以便我们可以获取一个Employee实体并使用这些外部源属性填充它?

子问题:有没有办法让EF接口与特定属性的不同数据库和表? (例如度假时间属性?)

2 个答案:

答案 0 :(得分:1)

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

如果您已经这样做,那么在您的业务逻辑层中创建一个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来持久保存它的方式。

答案 1 :(得分:1)

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

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

  

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

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

同样,您可以覆盖SaveChanges并保存"外星人"物业到其他商店。但同样,这会打倒表现。 (虽然在这里你可以同时处理一整套员工。)

这通常是您在可以访问各种数据源并协调其操作的服务中执行的操作。即从门户网站数据库中获取Employee个对象,一次性获取所需的所有项目,然后访问其他源以填充其他属性。您可能希望将这些属性添加到Employee作为未映射的属性,或者使用某种" canonic"从单独的数据源填充的员工类。