fluent nhibernate-具有关系上属性的多对多关系

fluent nhibernate-具有关系上属性的多对多关系,nhibernate,fluent-nhibernate,mappings,Nhibernate,Fluent Nhibernate,Mappings,我的代码正常工作,但是我在表/ddl中得到了两个额外的列,用于表示多对多关系,~~但是~~关系上有属性(标量) 我正在使用 1.2.0.712(FluentNHibernate.dll) 3.1.0.4000(NHibernate.dll) 实体: 公共部分类员工 { 公职人员() { 公共构造函数(); } 私有void CommonConstructor() { this.MyEmployeeToJobTitleMatchLinks=新列表(); } 公共虚拟Guid?EmployeeUUI

我的代码正常工作,但是我在表/ddl中得到了两个额外的列,用于表示多对多关系,~~但是~~关系上有属性(标量)

我正在使用 1.2.0.712(FluentNHibernate.dll) 3.1.0.4000(NHibernate.dll)

实体:
公共部分类员工
{
公职人员()
{
公共构造函数();
}
私有void CommonConstructor()
{
this.MyEmployeeToJobTitleMatchLinks=新列表();
}
公共虚拟Guid?EmployeeUUID{get;set;}
公共虚拟字节[]版本属性{get;set;}
公共虚拟字符串SSN{get;set;}
公共虚拟字符串LastName{get;set;}
公共虚拟字符串FirstName{get;set;}
公共虚拟日期时间CreateDate{get;set;}
公共虚拟日期时间HireDate{get;set;}
公共虚拟ICollection MyEmployeeToJobTitleMatchLinks{get;set;}
公共虚拟void AddJobTitleLink(EmployeeToJobTitleMatchLink链接)
{
link.TheEmployee=这个;
如果(!this.MyEmployeeToJobTitleMatchLinks.Contains(link))
{
this.MyEmployeeToJobTitleMatchLinks.Add(link);
}
如果(!link.TheJobTitle.MyJobTitleToEmployeeMatchLinks.Contains(链接))
{
link.TheJobTitle.MyJobTitleToEmployeeMatchLinks.Add(link);
}
}
公共虚拟无效删除作业标题链接(EmployeeToJobTitleMatchLink链接)
{
link.TheEmployee=这个;
if(this.MyEmployeeToJobTitleMatchLinks.Contains(link))
{
此.MyEmployeeToJobTitleMatchLinks.Remove(链接);
}
if(link.TheJobTitle.MyJobTitleToEmployeeMatchLinks.Contains(link))
{
link.TheJobTitle.MyJobTitleToEmployeeMatchLinks.Remove(link);
}
}
}
公共部分职业头衔
{
公职人员职衔()
{
公共构造函数();
}
私有void CommonConstructor()
{
this.MyJobTitleToEmployeeMatchLinks=新列表();
}
公共虚拟Guid?作业标题UID{get;set;}
公共虚拟字节[]版本属性{get;set;}
公共虚拟字符串JobTitleName{get;set;}
公共虚拟日期时间CreateDate{get;set;}
公共虚拟ICollection MyJobTitleToEmployeeMatchLinks{get;set;}
公共虚拟无效AddEmployeeLink(EmployeeToJobTitleMatchLink)
{
link.TheJobTitle=这个;
如果(!this.MyJobTitleToEmployeeMatchLinks.Contains(link))
{
this.MyJobTitleToEmployeeMatchLinks.Add(link);
}
如果(!link.TheEmployee.myemployeetojob标题matchlinks.Contains(link))
{
link.TheEmployee.myemployeetojob标题matchlinks.Add(link);
}
}
公共虚拟无效删除EmployeeLink(EmployeeToJobTitleMatchLink)
{
link.TheJobTitle=这个;
if(this.MyJobTitleToEmployeeMatchLinks.Contains(link))
{
this.MyJobTitleToEmployeeMatchLinks.Remove(link);
}
if(link.TheEmployee.myemployeetojob标题matchlinks.Contains(link))
{
link.TheEmployee.myemployeetojob标题匹配links.Remove(link);
}
}
}
公共部分类EmployeeToJobTitleMatchLink
{
公共雇员ToJobTitleMatchLink()
{
//this.Id=Guid.NewGuid();/*这与*/
}
公共虚拟Guid?LinkSurrogateTueUID{get;set;}
/*这些是~~关系~~的标量属性*/
公共虚拟整数PriorityRank{get;set;}
公共虚拟日期时间作业StartedOnDate{get;set;}
公共虚拟雇员雇员{get;set;}
公共虚拟作业标题作业标题{get;set;}
}
映射:
公共类EmployeeMap:ClassMap
{
公共雇员地图()
{
Id(x=>x.EmployeeUUID).GeneratedBy.GuidComb();
OptimisticLock.Version();
版本(x=>x.TheVersionProperty)
.列(“MyVersionColumn”)
.Not.Nullable()
.CustomSqlType(“时间戳”)
.Generated.Always();
Map(x=>x.SSN);
Map(x=>x.LastName);
Map(x=>x.FirstName);
映射(x=>x.CreateDate);
Map(x=>x.HireDate);
有许多(x=>x.MyEmployeeToJobTitleMatchLinks)
.Inverse()
.Cascade.All();
}
}
公共类JobTitleMap:ClassMap
{
公共工作标题地图()
{
Id(x=>x.jobtitleuid).GeneratedBy.GuidComb();
OptimisticLock.Version();
版本(x=>x.TheVersionProperty)
.列(“MyVersionColumn”)
.Not.Nullable()
.CustomSqlType(“时间戳”)
.Generated.Always();
Map(x=>x.jobtilename);
映射(x=>x.CreateDate);
HasMany(x=>x.MyJobTitleToEmployeeMatchLinks)
.Inverse()
.Cascade.All();
}
}
公共类EmployeeToJobTitleMatchLinkMap:ClassMap
{
公共雇员ToJobTitleMatchLinkMap()
{
Id(x=>x.linksubrogateUID).GeneratedBy.GuidComb();
Map(x=>x.PriorityRank);
Map(x=>x.JobStartedOnDate);
引用(x=>x.TheEmployee).Column(“TheEmployeeUUID”).Not.Nullable();/*带有“The”的命名约定不正确,但保留在此处,以便在DDL中可以轻松看到*/
引用(x=>x.TheJobTitle).Column(“TheJobTitleUID”).Not.Nullable();/*使用“The”的命名约定不正确,但保留在此处,以便在DDL中轻松看到*/
}
}
这很好,但我在ddl中得到了2个额外的(可为空)列。它们在下面用星号(*)标记

从[dbo]中选择*。[EmployeeToJobTitleMatchLink] 链接代理UID
PriorityRank 作业开始日期
员工ID
工作职位

*员工id
*职位名称

我理解这是“按惯例”。(上面有“\u id”的名字)。 但我不需要这些列。我需要能够自定义名称。 (雇员和J
public partial class Employee
{
    public Employee()
    {
        CommonConstructor();
    }
    private void CommonConstructor()
    {
        this.MyEmployeeToJobTitleMatchLinks = new List<EmployeeToJobTitleMatchLink>();
    }

    public virtual Guid? EmployeeUUID { get; set; }
    public virtual byte[] TheVersionProperty { get; set; }
    public virtual string SSN { get; set; }
    public virtual string LastName { get; set; }
    public virtual string FirstName { get; set; }
    public virtual DateTime CreateDate { get; set; }
    public virtual DateTime HireDate { get; set; }

    public virtual ICollection<EmployeeToJobTitleMatchLink> MyEmployeeToJobTitleMatchLinks { get; set; }
    public virtual void AddJobTitleLink(EmployeeToJobTitleMatchLink link)
    {
        link.TheEmployee = this;
        if (!this.MyEmployeeToJobTitleMatchLinks.Contains(link))
        {
            this.MyEmployeeToJobTitleMatchLinks.Add(link);
        }

        if (!link.TheJobTitle.MyJobTitleToEmployeeMatchLinks.Contains(link))
        {
            link.TheJobTitle.MyJobTitleToEmployeeMatchLinks.Add(link);
        }
    }

    public virtual void RemoveJobTitleLink(EmployeeToJobTitleMatchLink link)
    {
        link.TheEmployee = this;
        if (this.MyEmployeeToJobTitleMatchLinks.Contains(link))
        {
            this.MyEmployeeToJobTitleMatchLinks.Remove(link);
        }

        if (link.TheJobTitle.MyJobTitleToEmployeeMatchLinks.Contains(link))
        {
            link.TheJobTitle.MyJobTitleToEmployeeMatchLinks.Remove(link);
        }
    }
}

public partial class JobTitle
{

    public JobTitle()
    {
        CommonConstructor();
    }
    private void CommonConstructor()
    {
        this.MyJobTitleToEmployeeMatchLinks = new List<EmployeeToJobTitleMatchLink>();
    }

    public virtual Guid? JobTitleUUID { get; set; }
    public virtual byte[] TheVersionProperty { get; set; }
    public virtual string JobTitleName { get; set; }
    public virtual DateTime CreateDate { get; set; }
    public virtual ICollection<EmployeeToJobTitleMatchLink> MyJobTitleToEmployeeMatchLinks { get; set; }
    public virtual void AddEmployeeLink(EmployeeToJobTitleMatchLink link)
    {
        link.TheJobTitle = this;
        if (!this.MyJobTitleToEmployeeMatchLinks.Contains(link))
        {
            this.MyJobTitleToEmployeeMatchLinks.Add(link);
        }

        if (!link.TheEmployee.MyEmployeeToJobTitleMatchLinks.Contains(link))
        {
            link.TheEmployee.MyEmployeeToJobTitleMatchLinks.Add(link);
        }

    }

    public virtual void RemoveEmployeeLink(EmployeeToJobTitleMatchLink link)
    {
        link.TheJobTitle = this;
        if (this.MyJobTitleToEmployeeMatchLinks.Contains(link))
        {
            this.MyJobTitleToEmployeeMatchLinks.Remove(link);
        }

        if (link.TheEmployee.MyEmployeeToJobTitleMatchLinks.Contains(link))
        {
            link.TheEmployee.MyEmployeeToJobTitleMatchLinks.Remove(link);
        }

    }

}

public partial class EmployeeToJobTitleMatchLink
{
    public EmployeeToJobTitleMatchLink()
    {
        //this.Id = Guid.NewGuid(); /* this works in conjuction with <generator class="assigned"></generator>   */
    }

    public virtual Guid? LinkSurrogateUUID { get; set; }

    /*  These are "scalar properties of the ~~relationship~~  */
    public virtual int PriorityRank { get; set; }
    public virtual DateTime JobStartedOnDate { get; set; }

    public virtual Employee TheEmployee { get; set; }
    public virtual JobTitle TheJobTitle { get; set; }
}
public class EmployeeMap : ClassMap<Employee>
{
    public EmployeeMap()
    {
        Id(x => x.EmployeeUUID).GeneratedBy.GuidComb();

        OptimisticLock.Version();
        Version(x => x.TheVersionProperty)
            .Column("MyVersionColumn")
            .Not.Nullable()
            .CustomSqlType("timestamp")
            .Generated.Always();

        Map(x => x.SSN);
        Map(x => x.LastName);
        Map(x => x.FirstName);
        Map(x => x.CreateDate);
        Map(x => x.HireDate);

        HasMany(x => x.MyEmployeeToJobTitleMatchLinks)
            .Inverse()
            .Cascade.All();
    }
}

public class JobTitleMap : ClassMap<JobTitle>
{
    public JobTitleMap()
    {
        Id(x => x.JobTitleUUID).GeneratedBy.GuidComb();

        OptimisticLock.Version();
        Version(x => x.TheVersionProperty)
            .Column("MyVersionColumn")
            .Not.Nullable()
            .CustomSqlType("timestamp")
            .Generated.Always();

        Map(x => x.JobTitleName);
        Map(x => x.CreateDate);
        HasMany(x => x.MyJobTitleToEmployeeMatchLinks)
            .Inverse()
            .Cascade.All();
    }
}

public class EmployeeToJobTitleMatchLinkMap : ClassMap<EmployeeToJobTitleMatchLink>
{
    public EmployeeToJobTitleMatchLinkMap()
    {
        Id(x => x.LinkSurrogateUUID).GeneratedBy.GuidComb();
        Map(x => x.PriorityRank);
        Map(x => x.JobStartedOnDate);
        References(x => x.TheEmployee).Column("TheEmployeeUUID").Not.Nullable();/*Bad naming convention with "The", but left here so it can be seen easily in the DDL*/
        References(x => x.TheJobTitle).Column("TheJobTitleUUID").Not.Nullable();/*Bad naming convention with "The", but left here so it can be seen easily in the DDL*/
    }
}
public class EmployeeMap : ClassMap<Employee>
{
    public EmployeeMap()
    {
        Id(x => x.EmployeeUUID).GeneratedBy.GuidComb();

        OptimisticLock.Version();
        Version(x => x.TheVersionProperty)
            .Column("MyVersionColumn")
            .Not.Nullable()
            .CustomSqlType("timestamp")
            .Generated.Always();

        Map(x => x.SSN);
        Map(x => x.LastName);
        Map(x => x.FirstName);
        Map(x => x.CreateDate);
        Map(x => x.HireDate);

        HasMany(x => x.MyEmployeeToJobTitleMatchLinks)
            .Inverse()
            .Cascade.All()
            .KeyColumn("TheEmployeeUUID")
            ;

    }
}





public class JobTitleMap : ClassMap<JobTitle>
{
    public JobTitleMap()
    {
        Id(x => x.JobTitleUUID).GeneratedBy.GuidComb();

        OptimisticLock.Version();
        Version(x => x.TheVersionProperty)
            .Column("MyVersionColumn")
            .Not.Nullable()
            .CustomSqlType("timestamp")
            .Generated.Always();


        Map(x => x.JobTitleName);
        Map(x => x.CreateDate);
        HasMany(x => x.MyJobTitleToEmployeeMatchLinks)
            .Inverse()
            .Cascade.All()
            .KeyColumn("TheJobTitleUUID")
        ;   

    }
}



public class EmployeeToJobTitleMatchLinkMap : ClassMap<EmployeeToJobTitleMatchLink>
{

    public EmployeeToJobTitleMatchLinkMap()
    {
        Id(x => x.LinkSurrogateUUID).GeneratedBy.GuidComb();
        Map(x => x.PriorityRank);
        Map(x => x.JobStartedOnDate);

        References(x => x.TheEmployee).Column("TheEmployeeUUID").Not.Nullable();/*Bad naming convention with "The", but left here so it can be seen easily in the DDL*/
        References(x => x.TheJobTitle).Column("TheJobTitleUUID").Not.Nullable();/*Bad naming convention with "The", but left here so it can be seen easily in the DDL*/

    }
}
public class JobTitleMap : ClassMap<JobTitle> 
{ 
    public JobTitleMap() 
    { 
        Id(x => x.JobTitleUUID).GeneratedBy.GuidComb(); 

        OptimisticLock.Version(); 
        Version(x => x.TheVersionProperty) 
            .Column("MyVersionColumn") 
            .Not.Nullable() 
            .CustomSqlType("timestamp") 
            .Generated.Always(); 

        Map(x => x.JobTitleName); 
        Map(x => x.CreateDate); 
        HasMany(x => x.MyJobTitleToEmployeeMatchLinks) 
            .Inverse() 
            .Cascade.All()
            **.KeyColumn("TheJobTitleUUID")**
    } 
}