是否可以根据EF Code First中的条件映射属性?

时间:2013-09-26 00:24:52

标签: entity-framework ef-code-first entity-framework-4.1

我有一个Employee实体,它有多个Unit实体,它们也以各种方式关联(例如,作为经理,主管等......)。它们与Unit的关系在UnitRelationships表中定义,该表包括除EmployeeId,UnitId和RelationshipTypeId属性之外的IsActive属性。

我想要做的是在Employee实体上创建特定的属性:

SupervisedUnits {get;set;}
ManagedUnits{get;set;}

...并配置映射,以便“SupervisedUnits”仅返回存在活动(IsActive = true)关系且RelationshipTypeId ='Supervisor'的单位。与ManagedUnits相同的类型。

那么,有没有办法在EF Code First中执行此操作,以便我可以在LINQ-to-Entities查询中实际使用这些属性(SupervisedUnits和ManagedUnits)?

由于

1 个答案:

答案 0 :(得分:0)

可能有几种方法可以做到这一点。

  1. “活跃”关系是单位与员工之间的一对多关系,“非活动”关系是多对多关系。因此,将它们设置为两种不同的关系,当关系处于非活动状态时,将Supervisor移至InactiveSupervisors。这样做可以为您提供SupervisedUnits导航属性(如您所愿)和InActiveSupervisedUnits属性

  2. 该关系是多对多关系,具有IsActiveActiveFromActiveTo等属性。现在这种关系确实需要成为一个实体。您可以在UnitRelationship实体上使用继承:

    public class SupervisorUnitRelationShip : UnitRelationship{ }
    

    public class ManagerUnitRelationShip : UnitRelationship { }

  3. 然后您可以按类型添加导航属性:

    public virtual Collection<SupervisorUnitRelationship> SupervisedRelations {get;set;}
    public virtual Collection<ManagerUnitRelationship> ManagedRelations {get;set;}
    

    进入单位你必须通过单位关系

    var SupervisedUnits = SupervisedRelations.Units;