Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fluent nhibernate Fluent NHibernate-将2个表映射到一个类_Fluent Nhibernate - Fatal编程技术网

Fluent nhibernate Fluent NHibernate-将2个表映射到一个类

Fluent nhibernate Fluent NHibernate-将2个表映射到一个类,fluent-nhibernate,Fluent Nhibernate,我有一个这样的桌子结构 table Employees EmployeeID EmployeeLogin EmployeeCustID table Customers CustomerID CustomerName 我想将上面的结构映射到一个名为: Class Employee EmployeeID EmployeeLogin EmployeeName 我如何用流利的nhibernate做到这一点?EmployeeCustID是唯一的吗?如果没有,这将永远不会起作用,因为您

我有一个这样的桌子结构

table Employees
 EmployeeID
 EmployeeLogin
 EmployeeCustID

table Customers
 CustomerID
 CustomerName
我想将上面的结构映射到一个名为:

Class Employee
 EmployeeID
 EmployeeLogin
 EmployeeName

我如何用流利的nhibernate做到这一点?

EmployeeCustID是唯一的吗?如果没有,这将永远不会起作用,因为您将尝试将两种不同的实体类型填充到1中。另外,对于您的结构,您希望如何保存实例?->CustomerID未知,因此无法保存此类实体


IMHO最好将客户作为员工的相关实体,因为(我假设)如果员工也是客户,EmployeeCustID用于将客户实体链接到员工实体,这意味着“客户”只是员工的一个角色,因此是可选的和可更改的,因此应该是一个单独的实体。

我不知道使用fluent是否可行,但在xml中您使用join元素:

简化:

<class name="Employee" table="Customers" >
  <id name="CustomerID" .../>

  <property name="CustomerName"/>

  <join table="Employees">
    <key column="EmployeeCustID" />
    <property name="EmployeeLogin" />
  </join>

</class>


见此

自从Fluent NHibernate升级到1.0后,我就没有尝试过,因此我的语法可能不正确。我敢肯定,只有当
Customer.CustomerId
员工的外键时,这才有效

public class EmployeeMap : ClassMap<Employee>
{
  public EmployeeMap()
  {
    Id(x => x.EmployeeId);
    Map(x => x.EmployeeLogin);

    Table("Customer", m =>
    {
      m.Map(x => x.EmployeeName, "CustomerName");
    });
  }
}
公共类EmployeeMap:ClassMap
{
公共雇员地图()
{
Id(x=>x.EmployeeId);
Map(x=>x.EmployeeLogin);
表(“客户”,m=>
{
m、 映射(x=>x.EmployeeName,“CustomerName”);
});
}
}

我同意上面Frans的观点,但如果您仍在使用其他人的代码,并且必须使用现有的结构,则可以使用WithTable

public class EmployeesMap : ClassMap<Employees>
{
    public EmployeesMap()
    {
        Id(x => x.EmployeeId);
        Map(x => x.EmployeeLogin);

        WithTable("Customers", join =>
            {
                join.Map(m => m.EmployeeName, "CustomerName");
                join.WithKeyColumn("EmployeeCustID");
            });
    }
}

[DataContract(IsReference = true)]
public class Employees
{
    [DataMember]
    public virtual int EmployeeId { get; set; }

    [DataMember]
    public virtual string EmployeeLogin { get; set; }

    [DataMember]
    public virtual string EmployeeName { get; set; }
}
public class EmployeesMap:ClassMap
{
公共雇员MAP()
{
Id(x=>x.EmployeeId);
Map(x=>x.EmployeeLogin);
WithTable(“客户”,join=>
{
join.Map(m=>m.EmployeeName,“CustomerName”);
join.WithKeyColumn(“EmployeeCustID”);
});
}
}
[DataContract(IsReference=true)]
公营雇员
{
[数据成员]
公共虚拟int EmployeeId{get;set;}
[数据成员]
公共虚拟字符串EmployeeLogin{get;set;}
[数据成员]
公共虚拟字符串EmployeeName{get;set;}
}

您好,您好,您是对的,您可以从Customers表中进行连接,但我想用另一种方式进行连接。使用Employees表并在中加入Customers表,但这会导致无法使用正确的id加入,因为Customers表没有外键。为什么要做不同的操作?这有关系吗?在映射中只有这种方式。你在课堂和表格中都看不到这一点。那又怎样?在Fluent中,您将使用with table(“2ndTableName”,m=>{/*2nd table mappings*/);我刚刚读到另一条评论,说您不允许客户对员工进行FK,所以这可能不起作用。-1:这不起作用。它将尝试将
员工.EmployeeId
客户.EmployeeCustID
合并,而不是
员工.EmployeeCustID
客户.CustomerId
。。。