NHibernate中间表按代码映射

时间:2015-01-22 15:55:24

标签: nhibernate nhibernate-mapping mapping-by-code

我知道在stackoverflow上有关于这个主题的类似问题,但是没有一个能解决我的问题。我坚持了,至少两天了。所以这是我的问题:

我有两个Many-To-Many关系的表,如下所示:

Department * - * Person

我不想使用Many-To-Many关系,而是使用两个Many-To-One并将链接表定义为实体。

链接表应称为“Lam”。

我的实体

public class Department
{
    public virtual int Id { get; set; }
    public virtual IList<Lam> Lams { get; set; }
}

public class Person
{
    public virtual int Id { get; set; }
    public virtual IList<Lam> Lams { get; set; }
}

public class Lam
{
    public virtual Department Department { get; set; }
    public virtual Person Person { get; set; }
}

我的映射

public class DepartmentMapping : ClassMapping<Department>
{
    public DepartmentMapping()
    {
        Id(x => x.Id, map => map.Generator(Generators.Native));

        Bag(x => x.Lams, col =>
        {
            col.Key(k => k.Column("DepartmentId"));
            col.Inverse(true);
        }, r => r.OneToMany());
    }
}

public class PersonMapping : ClassMapping<Person>
{
    public PersonMapping()
    {
        Id(x => x.Id, map => map.Generator(Generators.Native));

        Bag(x => x.Lams, col =>
        {
            col.Key(k => k.Column("PersonId"));
            col.Inverse(true);
        }, r => r.OneToMany());
    }
}

配对映射:

public class LamMapping : ClassMapping<Lam>
{
    public LamMapping()
    {
        ManyToOne(x => x.Department, map =>
        {
            map.Column("DepartmentId");
        });

        ManyToOne(x => x.Person, map =>
        {
            map.Column("PersonId");
        });
    }
}

如果我尝试运行我的应用程序,则会收到以下错误消息:

  

“索引”附近的语法不正确。如果这是作为a的一部分   表提示,现在需要一个WITH关键字和括号。请参见SQL   Server Books Online以获得正确的语法。

有人可以告诉我,我的代码有什么问题吗?

1 个答案:

答案 0 :(得分:4)

映射原样是正确的(至少同样适用于我)。那么,问题是从哪里来你的例外?

让我们对简化的表/实体Person:

进行SQL SELECT查询
SELECT id FROM Person

那会有用。

但是如果 - 在地图中未显示的部分 - 存在人的某些属性,请说 Index 之类的这样:

// entity
public class Person
{
    ...
    // C# property named Index
    public virtual int Index { get; set; }
    ...
// mapping
public class PersonMapping : ClassMapping<Person>
{
    public PersonMapping()
    {
        ...
        // that by default would be column Index
        Property(x => x.Index)

这会导致像这样的

SELECT id, Index FROM Person

在SQL Server世界中,这将导致错误:

  

Msg 1018,Level 15,State 1,Line 1   索引&#39;附近的语法不正确。如果这是作为表提示的一部分,则现在需要A WITH关键字和括号。

所以,因为上面显示的映射是正确的,我会怀疑像这样的部分

如果是这种情况,我们可以使用

...
Property(x => x.Index, x => { x.Column("[Index]"); });