两个具有相同结构和架构但名称不同的表,需要插入和更新一个表 - NHibernate



我在一个数据库中有两个具有相同结构和模式的不同表。

Comp.Employee
Comp.EmployeeTemp

实体类:

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而不是Comp.Employee.我需要能够写入两个表,但不能同时使用相同的Employee实体。 如何在 NHibernate 和流畅映射中执行此操作?

更新:更新了我的问题以包括EmployeeTempMap映射和对 SaveOrUpdate() 的重载调用

有一个鲜为人知/使用的NHibernate功能称为"实体名称",它可能使你能够做你想做的事情 - 至少在某种程度上。


背景资料:

可以在此处找到该功能的介绍:使用实体名称将同一类映射到视图和表(也适用于具有相同结构的两个表)。

Fluent NHibernate也支持此功能,如源代码所示: Fluent-nhibernate 类映射

上述链接中的相关代码:

/// <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);
}

免责声明:(以下代码未经测试,但应该会让您走上正确的轨道。当出现问题或丢失时,请随意编辑)

正如我在对上面问题的评论中提到的,您可以像这样对类映射使用继承(缩短的示例):

// 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);

但是,我还没有验证您的目标(不必将员工"转换"为 EmployeeTemp)可以通过它来实现,因为 NHibernate 在使用 EntityNameEmployeeTemp加载对象并尝试使用 EntityNameEmployee保存它时可能会引发错误。您可能需要从会话中手动Evict()它,然后使用所需的实体名称Save()它。(您可能还需要清除对象的 ID。

让事情更简单的建议:

我不知道具有相同结构的两个不同表的设计背景,但是如果您的数据库结构不是一成不变的,您可以简单地使用一个表employee并添加一个列temp并将其用作查询的过滤器。将EmployeeTemp更改为Employee时,您只需将开关从temp = 1切换到temp = 0

有关类似情况,请参阅SO:模型中一个属性的多个数据库表

相关内容

  • 没有找到相关文章

最新更新