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 映射。
创建与部门的一对一联接关系。
我正在处理公司已决定迁移到 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 映射。
创建与部门的一对一联接关系。