两个具有相同结构和模式但名称不同的 table 需要插入和更新一个 table - NHibernate
Two tables with the same structure and schema but different names requiring inserts and updates to one table - NHibernate
我在一个数据库中有两个不同的 table,它们具有相同的结构和模式。
Comp.Employee
Comp.EmployeeTemp
实体class:
public class Employee
{
public virtual string Name {get;set;}
}
NHibernate 流畅映射:
public class EmployeeMap : ClassMap<Employee>
{
public EmployeeMap()
{
Map(x => Name);
}
}
public class EmployeeTempMap : ClassMap<Employee>
{
public EmployeeTempMap()
{
Map(x => Name);
}
}
var manager = new Employee { Name = "Tom"}
Session().SaveOrUpdate("EmployeeTemp", manager)
我想将 manager
实体保存到 Comp.EmpoyeeTemp
table 而不是 Comp.Employee
。我需要能够写入两个 table,但不能同时使用相同的 Employee
实体。
我如何在 NHibernate 和流畅的映射中做到这一点?
更新:
更新了我的问题以包括 EmployeeTempMap
映射和对 SaveOrUpdate()
的重载调用
很少有 known/used NHibernate 功能称为 "entity-name",它可以让您做您想做的事 - 至少在某种程度上。
背景资料:
可以在这里找到该功能的介绍:Mapping the same class to a view and a table using entity-name(也适用于具有相同结构的两个 table)。
Fluent NHibernate 也支持这个特性,可以在源码中看到:
fluent-nhibernate ClassMap
上面的相关代码link:
/// <summary>
/// Specifies an entity-name.
/// </summary>
/// <remarks>See http://nhforge.org/blogs/nhibernate/archive/2008/10/21/entity-name-in-action-a-strongly-typed-entity.aspx</remarks>
public void EntityName(string entityName)
{
attributes.Set("EntityName", Layer.UserSupplied, entityName);
}
免责声明:(以下代码未经测试,但应该会让您走上正轨。如果有错误或遗漏,请随时编辑)
正如我在上面对你的问题的评论中提到的,你可以像这样对 class 映射使用继承(简化示例):
// Base class
public class BaseEmployeeMap<T> : ClassMap<T> where T : Employee
{
public BaseEmployeeMap()
{
Map(p => p.Name);
// add all Properties that are common to both Employee and EmployeeTemp
}
}
// Mapping for Employee
public class EmployeeMap : BaseEmployeeMap<Employee>
{
public EmployeeMap() : base()
{
EntityName("Employee");
}
}
// Mapping for EmployeeTemp
public class EmployeeTempMap : BaseEmployeeMap<Employee>
{
public EmployeeTempMap() : base()
{
EntityName("EmployeeTemp");
}
}
现在您可以使用重载方法并提供 EntityName
:
来查询和插入项目
// both tempEmployee and employee will be instances of class "Employee"
var tempEmployee = session.Get("EmployeeTemp", id);
var employee = session.Get("Employee", id);
session.SaveOrUpdate("EmployeeTemp", tempEmployee);
session.SaveOrUpdate("Employee", employee);
但是,我还没有验证你的目标(不必 "convert" 一个 Employee 到 EmployeeTemp)可以用这个来实现,因为 NHibernate 在加载带有 EntityName 的对象时可能会抛出错误 EmployeeTemp
并尝试使用 EntityName Employee
保存它。您可能需要从会话中手动 Evict()
它,然后使用所需的 EntityName Save()
它。 (您可能还需要清除对象的 ID。)
简化事情的建议:
我不知道两个具有相同结构的不同 table 的设计背景,但是如果你的数据库结构不是一成不变的,你可以简单地使用一个 table employee
并添加一列 temp
并将其用作查询的过滤器。将 EmployeeTemp
更改为 Employee
时,您只需将开关从 temp = 1
切换到 temp = 0
。
对于类似的案例,请查看 SO:
我在一个数据库中有两个不同的 table,它们具有相同的结构和模式。
Comp.Employee
Comp.EmployeeTemp
实体class:
public class Employee
{
public virtual string Name {get;set;}
}
NHibernate 流畅映射:
public class EmployeeMap : ClassMap<Employee>
{
public EmployeeMap()
{
Map(x => Name);
}
}
public class EmployeeTempMap : ClassMap<Employee>
{
public EmployeeTempMap()
{
Map(x => Name);
}
}
var manager = new Employee { Name = "Tom"}
Session().SaveOrUpdate("EmployeeTemp", manager)
我想将 manager
实体保存到 Comp.EmpoyeeTemp
table 而不是 Comp.Employee
。我需要能够写入两个 table,但不能同时使用相同的 Employee
实体。
我如何在 NHibernate 和流畅的映射中做到这一点?
更新:
更新了我的问题以包括 EmployeeTempMap
映射和对 SaveOrUpdate()
很少有 known/used NHibernate 功能称为 "entity-name",它可以让您做您想做的事 - 至少在某种程度上。
背景资料:
可以在这里找到该功能的介绍:Mapping the same class to a view and a table using entity-name(也适用于具有相同结构的两个 table)。
Fluent NHibernate 也支持这个特性,可以在源码中看到: fluent-nhibernate ClassMap
上面的相关代码link:
/// <summary>
/// Specifies an entity-name.
/// </summary>
/// <remarks>See http://nhforge.org/blogs/nhibernate/archive/2008/10/21/entity-name-in-action-a-strongly-typed-entity.aspx</remarks>
public void EntityName(string entityName)
{
attributes.Set("EntityName", Layer.UserSupplied, entityName);
}
免责声明:(以下代码未经测试,但应该会让您走上正轨。如果有错误或遗漏,请随时编辑)
正如我在上面对你的问题的评论中提到的,你可以像这样对 class 映射使用继承(简化示例):
// Base class
public class BaseEmployeeMap<T> : ClassMap<T> where T : Employee
{
public BaseEmployeeMap()
{
Map(p => p.Name);
// add all Properties that are common to both Employee and EmployeeTemp
}
}
// Mapping for Employee
public class EmployeeMap : BaseEmployeeMap<Employee>
{
public EmployeeMap() : base()
{
EntityName("Employee");
}
}
// Mapping for EmployeeTemp
public class EmployeeTempMap : BaseEmployeeMap<Employee>
{
public EmployeeTempMap() : base()
{
EntityName("EmployeeTemp");
}
}
现在您可以使用重载方法并提供 EntityName
:
// both tempEmployee and employee will be instances of class "Employee"
var tempEmployee = session.Get("EmployeeTemp", id);
var employee = session.Get("Employee", id);
session.SaveOrUpdate("EmployeeTemp", tempEmployee);
session.SaveOrUpdate("Employee", employee);
但是,我还没有验证你的目标(不必 "convert" 一个 Employee 到 EmployeeTemp)可以用这个来实现,因为 NHibernate 在加载带有 EntityName 的对象时可能会抛出错误 EmployeeTemp
并尝试使用 EntityName Employee
保存它。您可能需要从会话中手动 Evict()
它,然后使用所需的 EntityName Save()
它。 (您可能还需要清除对象的 ID。)
简化事情的建议:
我不知道两个具有相同结构的不同 table 的设计背景,但是如果你的数据库结构不是一成不变的,你可以简单地使用一个 table employee
并添加一列 temp
并将其用作查询的过滤器。将 EmployeeTemp
更改为 Employee
时,您只需将开关从 temp = 1
切换到 temp = 0
。
对于类似的案例,请查看 SO: