Fluent NHibernate - многія да многіх адносін з атрыбутам адносін

У мяне ёсць код працуе, але я атрымліваю 2 дадатковых слупкоў у табліцы/DDL, прадстаўляць многія да многіх адносін, але ~~ ~~ з атрыбутамі (скаляраў) на адносінах.

Я выкарыстоўваю 1.2.0.712 (FluentNHibernate.dll) 3.1.0.4000 (NHibernate.dll)

аб'екты:

public partial class Employee
{
    public Employee()
    {
        CommonConstructor();
    }
    private void CommonConstructor()
    {
        this.MyEmployeeToJobTitleMatchLinks = new List();
    }

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

    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 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    */
    }

    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
{
    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
{
    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
{
    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*/
    }
}

Гэта выдатна працуе, але я атрымліваю 2 дадатковых (Nullable) слупкоў у DDL. Яны адзначаны зорачкай (*) ніжэй.

SELECT * FROM [DBO]. [EmployeeToJobTitleMatchLink] LinkSurrogateUUID
PriorityRank JobStartedOnDate
TheEmployeeUUID
TheJobTitleUUID

* EMPLOYEE_ID
* JobTitle_id

Я разумею, што гэта «па дамове». (Імёны з «_id» на іх). Але я не патрэбныя гэтыя слупкі. І мне трэба, каб быць у стане мець наладжвальныя імёны. (TheEmployeeUUID і TheJobTitleUUID у гэтым макеце прыкладзе.)

Мой канец гульні мець:

SELECT * FROM [DBO]. [EmployeeToJobTitleMatchLink] LinkSurrogateUUID (UniqueIdentifier, сурагатным ключ)
PriorityRank (скаляр, цэлае) JobStartedOnDate (скаляр, дата і час) TheEmployeeUUID (UniqueIdentifier, FK назад dbo.Employee.EmployeeUUID) TheJobTitleUUID (UniqueIdentifier, FK назад dbo.JobTitle.JobTitleUUID)

Атрыбут (ы) на адносіны ~ вельмі важна захаваць. (PriorityRank і JobStartedOnDate у гэтым макеце прыкладзе.)

Дзякуючы. Я ~ так блізка.

EDIT:

Адлюстравання, якія працуюць:

public class EmployeeMap : ClassMap
{
    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
{
    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
{

    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*/

    }
}

Дзякуючы Натан!

PS Адзін новы тэрмін, які я даведаўся, у той час як звяртаючыся да дапамогі/бразджанне сам быў

«Вызнача адносіны»

It was in the comments area of this page: LINK1

У выпадку, калі гэтая старонка памірае дзе-то ў будучыні, вось што адкаментаваў ўставілі ў:

Гэта называецца 'вызнача адносіны' (спасылка: http://www.orm.net ) і Niam/ORM гэта звычайна вызначаецца як адносіны, якія на сабе сутнасць з атрыбутамі. Вызнача адносіны заўсёды утвараючы, па меншай меры, адзін M: N адносіны. (З http://weblogs.asp.net/fbouma/ )

0

1 адказы

Я думаю, што трэба дадаць KeyColumn ( «ключ-імя»), як частка адлюстравання HasMany на абодва вашы JobTitleMap і EmplyeeMap. Гэта таму, што вольна-NHibernate выкарыстоўвае пагаднення для стварэння FK ў табліцы EmployeeToJobTitleMatchLink. Выкарыстоўваючы KeyColumn як частка адлюстравання HasMay павінны перавызначыць канвенцыі.

Нешта накшталт наступнага: -

public class JobTitleMap : ClassMap 
{ 
    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")**
    } 
} 
1
дададзена
Дзякуй (плюс адзін). Я не мог атрымаць маю галаву з класа EmployeeToJobTitleMatchLinkMap. : <Ваш намёк працуе. (У EmployeeMap.cs) HasMany (X => x.MyEmployeeToJobTitleMatchLinks) .Inverse() .Cascade.All() .KeyColumn ( "TheEmployeeUUID"); (У JobTitleMap.cs) HasMany (X => x.MyJobTitleToEmployeeMatchLinks) .Inverse() .Cascade.All() .KeyColumn ( "TheJobTitleUUID")
дададзена аўтар granadaCoder, крыніца