多到“二”;关系增加额外的FK(也不工作)

本文关键字:FK 工作 增加额 关系 多到 | 更新日期: 2023-09-27 17:52:57

我有以下类

public class Foo
{
    public virtual int Id { get; protected set; }
    public virtual IEnumerable<Bar> Bars { get; protected set; }
}
public class Bar
{
    public virtual int Id { get; protected set; }
    public virtual Foo Foo1 { get; set; }
    public virtual Foo Foo2 { get; set; }
}

具有以下(可能不正确的)映射

public class FooMap : ClassMap<Foo>
{
    public FooMap()
    {
        this.Id(x => x.Id);
        this.HasMany(x => x.Bars);
    }
}
public class BarMap : ClassMap<Bar>
{
    public BarMap()
    {
        this.Id(x => x.Id);
        this.References(x => x.Foo1);
        this.References(x => x.Foo2);
    }
}

创建表时,FNH执行以下操作:

create table "Bar" (
    Id  integer primary key autoincrement,
   Foo1_id INT,
   Foo2_id INT,
   Foo_id INT,
   constraint FK52E419EE7F0CDD3 foreign key (Foo1_id) references "Foo",
   constraint FK52E419EE3C0DCDD3 foreign key (Foo2_id) references "Foo",
   constraint FK52E419EE34BDF7FF foreign key (Foo_id) references "Foo"
)

。有一个额外的FK引用。

这意味着调用someBar.Foo1是可以的,但是调用soFoo.Bars总是空的。

我已经研究过使用

this.HasMany(x => x.Bars).KeyColumns.Add("Foo1_id", "Foo2_id");

但是返回错误:

外键(FK52E419EE660E4A59:Bar [Foo1_id, Foo2_id]))必须与引用的主键(Foo [Id])具有相同的列数。

映射这种形式的关系的正确方法是什么?


如果我们有

Table:Foos   |  Table:Bars
Id           |  Id    Foo1_id   Foo2_id
--           |  -----------------------
11           |  1     11        12
12           |  2     12        11
13           |  3     12        13

this.Session.Get<Foo>(11).Bars应包含Bar s, 12Id

多到“二”;关系增加额外的FK(也不工作)

我很确定你不能做你所要求的,与Foo的自动"合并巫术"。酒吧(因此我的问题在问题的评论)。

我认为这是你可以做的。注意,我想出了一些比Foo和Bar不那么通用的东西。

我有一个"项目"。还有一个雇员。每个员工都可以"拥有"或"参与"一个项目(或两者兼而有之)。显然,在现实世界中,强迫员工只拥有或只从事一个项目是愚蠢的。但是在这里可以。

该项目有(许多)业主和工人。我有一个获取(只读获取)属性任何人与项目相关。这就是你合并两种不同关系的地方。

我不知道这个的延迟初始化。我只是指出,自动合并的东西你正在寻找…可能不太可能。

public class Project
{
    public virtual int ProjectKey { get; set; }
    public virtual string ProjectName { get; set; }
    public virtual IList<Employee> ProjectOwners { get; set; }
    public virtual IList<Employee> ProjectWorkers { get; set; }
    public virtual IList<Employee> AnybodyAssociatedWithThisProject 
    {
        get
        {
            List<Employee> returnItems = new List<Employee>();
            if (null != this.ProjectOwners)
            {
                returnItems.AddRange(this.ProjectOwners);
            }
            if (null != this.ProjectOwners)
            {
                returnItems.AddRange(this.ProjectWorkers);
            }
            return returnItems;
        }
    }
}

public class Employee
{
    public virtual int EmployeeKey { get; set; }
    public virtual string SSN { get; set; }
    public virtual Project OwnedProject { get; set; }
    public virtual Project WorkedOnProject { get; set; }
}

public class ProjectMap : ClassMap<Project>
{
    public ProjectMap()
    {
        Id(x => x.ProjectKey);
        Map(x => x.ProjectName);
        HasMany(x => x.ProjectOwners)
            .KeyColumn("OwnedProjectKey");
        HasMany(x => x.ProjectWorkers)
            .KeyColumn("WorkedOnProjectKey");
        Table("Project");
    }
}
public class EmployeeMap : ClassMap<Employee>
{
    public EmployeeMap()
    {
        Id(x => x.EmployeeKey);
        Map(x => x.SSN);
        References(x => x.OwnedProject).Column("OwnedProjectKey");
        References(x => x.WorkedOnProject).Column("WorkedOnProjectKey");
        Table("Employee");
    }
}

我测试了一些数据。一切似乎都很顺利。一个警告是,如果一个员工"拥有"并"从事"一个项目,我的简单。合并代码将复制该雇员。除此之外,它看起来是实心的