EF 等效于 nHibernate 公式映射

EF equivalent of nHibernate Formula mapping

我正在处理公司已决定迁移到 EF 的一些遗留 nHibernte 代码。我找到了使用公式映射的流畅映射,并想在 EF (6.*) 中复制它。据我了解,公式映射在 EF 中不可用,但希望有人提供 简单 解决方案或解决方法。

简化实体:

public class Department
{
    public virtual Guid Id { get; set; }
    public virtual string Name { get; set; }
    public virtual bool CanChange { get; set; }        
}

简化的 nHibernate 映射:

public DepartmentMap()
{
    Map(x => x.Name);
    Map(x => x.CanChange)
      .Formula("(select case when count(*) > 0 then 0 else 1 end from Users where Users.placeid = Id)");
}

你可以更改数据库吗?

这看起来像是(非持久化)Computed Column 的候选者。

添加该列,然后将其映射为常规 属性 并将其标记为只读。

您需要为查询创建一个函数,因为它使用另一个 table

CREATE FUNCTION dbo.getCanChangeDepartment(@placeId int)
RETURNS bit
AS
BEGIN
    DECLARE @r bit

    select @r = case when count(0) > 0 then cast(0 as bit) 
     else cast(1 as bit) end 
     from Users 
     where Users.placeid = @placeId

    RETURN @r
END

ALTER TABLE dbo.Department
   ADD CanChange AS dbo.getCanChangeDepartment(Id)

另一种方法是创建一个 returns 所有部门以及是否可以更改的视图。

使用 EF 映射。

创建与部门的一对一联接关系。