fluent nhibernate-具有关系上属性的多对多关系
我的代码正常工作,但是我在表/ddl中得到了两个额外的列,用于表示多对多关系,~~但是~~关系上有属性(标量) 我正在使用 1.2.0.712(FluentNHibernate.dll) 3.1.0.4000(NHibernate.dll) 实体: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
公共部分类员工
{
公职人员()
{
公共构造函数();
}
私有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]
链接代理UIDPriorityRank 作业开始日期
员工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")**
}
}