【问题标题】:Fluent Nhibernate HasMany to One Table from Several TablesFluent Nhibernate HasMany 从几张桌子到一张桌子
【发布时间】:2012-05-16 13:25:42
【问题描述】:

我有一个从其他几个实体引用的实体/类/表,我使用 Fluent NHibernate 为我处理 ORM。在少数情况下,这是一个简单的引用,我可以将外键 ID 存储为列并以这种简单的方式处理引用,但在其他一些情况下,我需要引用这些项目的列表,并且需要完成我能想到的至少三门课。您可以假设将复制此设置以处理其他类的关系。

公共实体的外观如下(HasManys 中的几个其他实体拥有的实体):

public class Student {
    public virtual int Id {get; set;}
    public virtual string Name {get; set;}
}

下面是ShopCourse 实体的样子:

public class ShopCourse {
    public virtual int Id {get; set;}
    public virtual int Name {get; set;}
    public virtual IList<Student> Students {get; set;}
}

想象一下,我拥有的其他几个课程(例如特定课程)可以“拥有”几个学生。为了维持这种关系,我必须在我的数据库中创建一个表来跟踪两者之间的外键(对于每个引用 Student 的实体)——这个中间表不需要实体,Fluent 不需要考虑除非我将表本身的字符串名称交给它:

表格:ShopCourseStudents

int - ShopCourseId
int - StudentId

最后,这是我的映射。您可以假设实体本身映射得很好 - 诸如 Id 的命名方案之类的事情已解决并正常工作。问题出在我尝试初始化具有HasManyStudent 的任何实体时:

//Inside a FluentlyConfigure().Mappings(m => m.AutoMappings.Add() call:
.Override<ShopCourse>(map => {
    map.HasMany(x => x.Students)
        .Table("ShopCourseStudents")
        .KeyColumns.Add("ShopCourseId")
        .KeyColumns.Add("StudentId")
        .Cascade.All();
    })

问题是当我尝试加载ShopCourses 的列表时,我得到了 Fluent 错误:

外键(ABC123AF9:Student [ShopCourseId, StudentId])必须有 与引用的主键相同的列数(ShopCourses [编号])

覆盖 Fluent 的 Student 映射,因为它很简单。就本示例而言,Student 不需要知道它属于哪个 ShopCourses,或者可能拥有该特定 Student 记录的任何其他课程。

这似乎是我在做一些基本的错误 - 它到底是什么?提前很多义务!

【问题讨论】:

    标签: asp.net-mvc nhibernate fluent-nhibernate automapper


    【解决方案1】:

    因此,问题出在我在项目中重复使用的自定义代码上,显然为处​​理多对多约定而编写的代码大部分都被破坏了。我在这里寻找的是ManyToMany 关系,而不是HasMany。我遇到的问题是我的代码强制将子对象(在本例中为Student)上的引用引用到父对象,我不需要而且只会使事情复杂化。删除它,然后我的ManyToMany 就可以了:

    .Override<ShopCourse>(map => {
        map.HasManyToMany(x => x.Students)
            .Table("ShopCourseStudents")
            .ParentKeyColumn("ShopCourseId")
            .ChildKeyColumn("StudentId")
            .Cascade.All()
    

    【讨论】:

      猜你喜欢
      • 2011-10-09
      • 2020-07-29
      • 2012-05-23
      • 1970-01-01
      • 1970-01-01
      • 2017-02-07
      • 2011-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多