多到“二”;关系增加额外的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, 1
和2
的Id
我很确定你不能做你所要求的,与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");
}
}
我测试了一些数据。一切似乎都很顺利。一个警告是,如果一个员工"拥有"并"从事"一个项目,我的简单。合并代码将复制该雇员。除此之外,它看起来是实心的