我知道在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以获得正确的语法。
有人可以告诉我,我的代码有什么问题吗?
答案 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]"); });