akıcı nhibernate - ilişki özniteliği ile birçok ilişkisi çok

ilişkisine nitelikler (skalerler) ile ~~ Benim kod çalışma var, ama çoğu ilişkiye bir çoğu temsil etmek, tablo/ddl 2 ilave sütunları alıyorum, ~~ ama.

Ben kullanıyorum 1.2.0.712 (FluentNHibernate.dll) 3.1.0.4000 (NHibernate.dll)

varlık sayısı:

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

Eşlemeler:

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

Bu iyi çalışıyor, ancak ddl'de 2 ek (nullable) sütun alıyorum. Bunlar aşağıda asteriks (*) ile işaretlenmiştir.

[Dbo] 'dan * seçeneğini seçin. [EmployeeToJobTitleMatchLink] LinkSurrogateUUID
PriorityRank JobStartedOnDate
TheEmployeeUUID
TheJobTitleUUID

* Employee_id
* JobTitle_id

Anladığım kadarıyla bu "kongre". (Üzerinde "_id" yazan isimler). Ama bu sütunlara ihtiyacım yok. Ve özel isimlere sahip olmalıyım. (Bu sahte örnekte TheEmployeeUUID ve TheJobTitleUUID.)

Son oyunumun sahip olması:

[Dbo] 'dan * seçeneğini seçin. [EmployeeToJobTitleMatchLink] LinkSurrogateUUID (UniqueIdentifier, SurrogateKey)
PriorityRank (skaler, int) JobStartedOnDate (skaler, datetime) TheEmployeeUUID (UniqueIdentifier, FK, dbo.Employee.EmployeeUUID'ye geri dön) TheJobTitleUUID (UniqueIdentifier, FK, dbo.JobTitle.JobTitleUUID'ye geri dön)

~ İlişkideki nitelik (ler) in tutulması çok önemlidir. (Bu sahte örnekte PriorityRank ve JobStartedOnDate.)

Teşekkürler. Ben çok yakınım.

DÜZENLE:

Çalışılan eşlemeler:

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

    }
}

Teşekkürler Nathan!

PS Kendimi googling ederken/öğrendiğimde yeni bir terim oldu

"nesnel ilişki"

It was in the comments area of this page: LINK1

Bu sayfanın gelecekte bir zamanda ölmesi durumunda, burada yapıştırılan yorum:

Buna 'nesnelleştirilmiş bir ilişki' denir (ref: http://www.orm.net ) ve NIAM/ORM tipik olarak öznitelikleri olan bir varlık üzerinde olan bir ilişki olarak tanımlanır. Nesnelleştirilmiş bir ilişki her zaman en az bir m: n ilişki oluşturmaktadır. ( http://weblogs.asp.net/fbouma/ 'den)

0

1 cevap

Ben de JobMitleMap ve EmplyeeMap için HasMany haritalama bir parçası olarak bir KeyColumn ("anahtar adı") eklemeniz gerektiğini düşünüyorum. Bunun nedeni, akıcı-nhibernate'in EmployeeToJobTitleMatchLink tablosunda FK'yi oluşturmak için kurallar kullanmasıdır. HasMay eşlemesinin bir parçası olarak KeyColumn kullanmak, sözleşmeyi geçersiz kılmalıdır.

Aşağıdaki gibi bir şey: -

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
katma
Teşekkür ederim (Artı Bir). Kafamı EmployeeToJobTitleMatchLinkMap sınıfından çıkaramadım. : <�İpucu. (EmployeeMap.cs içinde) HasMany (x => x.MyEmployeeToJobTitleMatchLinks) .Inverse() .Cascade.All() .KeyColumn ("TheEmployeeUUID"); (JobTitleMap.cs içinde) HasMany (x => x.MyJobTitleToEmployeeMatchLinks) .Inverse() .Cascade.All() .KeyColumn ("TheJobTitleUUID")
katma yazar granadaCoder, kaynak