流利的NHibernate自动映射,简单问题,为外键关系添加额外字段
对不起,如果我说不通的话,我的脑子现在快炸了。我刚开始在NHibernate编程,由于自动映射,我决定转到Fluent NHibernate,但我遇到了一点麻烦,以下是它应该具有的关系: 以下是Fluent Nhibernate的自动映射关系,请注意,MemberId已添加到表中: 我猜这是因为在我的约定中,关系被设置为反向。我需要使关系反向()否则级联不起作用。以下是我的惯例:流利的NHibernate自动映射,简单问题,为外键关系添加额外字段,nhibernate,fluent-nhibernate,automapping,Nhibernate,Fluent Nhibernate,Automapping,对不起,如果我说不通的话,我的脑子现在快炸了。我刚开始在NHibernate编程,由于自动映射,我决定转到Fluent NHibernate,但我遇到了一点麻烦,以下是它应该具有的关系: 以下是Fluent Nhibernate的自动映射关系,请注意,MemberId已添加到表中: 我猜这是因为在我的约定中,关系被设置为反向。我需要使关系反向()否则级联不起作用。以下是我的惯例: public class HasManyConvention : IHasManyConvention
public class HasManyConvention : IHasManyConvention
{
public void Apply(FluentNHibernate.Conventions.Instances.IOneToManyCollectionInstance instance)
{
instance.Key.Column(instance.EntityType.Name + "ID");
//instance.Inverse();
if (instance.Member.GetCustomAttributes(typeof(CascadeAttribute), false).Length <= 0)
{
instance.Cascade.None();
return;
}
var cascadeOption = (CascadeAttribute)instance.Member.GetCustomAttributes(typeof(CascadeAttribute), false)[0];
switch (cascadeOption.CascadeOption)
{
case Enums.CascadeOptions.All:
instance.Cascade.All();
break;
case Enums.CascadeOptions.AllDeleteOrphan:
instance.Cascade.AllDeleteOrphan();
break;
case Enums.CascadeOptions.Delete:
instance.Cascade.All();
break;
case Enums.CascadeOptions.DeleteOrphan:
instance.Cascade.DeleteOrphan();
break;
case Enums.CascadeOptions.None:
instance.Cascade.None();
break;
case Enums.CascadeOptions.SaveUpdate:
instance.Cascade.SaveUpdate();
break;
}
}
}
public class ReferenceConvention : IReferenceConvention
{
public void Apply(FluentNHibernate.Conventions.Instances.IManyToOneInstance instance)
{
instance.Column(instance.Property.Name + "Fk");
if (Attribute.IsDefined(instance.Property.PropertyType.Assembly, typeof(DomainSignatureAttribute)))
instance.UniqueKey("DomainSignature");
else
instance.Index(instance.Property.Name + "Index");
}
}
公共类有许多约定:IHasManyConvention
{
public void Apply(FluentNHibernate.Conventions.Instances.IOneToManyCollectionInstance实例)
{
instance.Key.Column(instance.EntityType.Name+“ID”);
//instance.Inverse();
if(instance.Member.GetCustomAttributes(typeof(CascadeAttribute),false).Length因为Member.Mail
被映射为一对多,这会导致邮件中出现外键。从来没有人说过'Member.Mail'是一个反向关系,也没有人说过外键是如何调用的。因此它创建了一个标准外键。@Eitan,他的意思是你从来没有指定应该如何映射该关系,所以它是just采用一个标准外键,它按约定调用MemberId。@Eitan:Reverse意味着该关系对另一个关系是冗余的,不需要存储。它不会更改数据库模型,但如果希望具有双向引用,则应使用Reverse。
public class Member : Entity
{
public Member()
{
Mail = new List<Mail>();
}
[Cascade(Enums.CascadeOptions.All)]
public virtual IList<Mail> Mail
{
get; set;
}
}
public class Mail : Entity
{
public virtual Member Receiver
{
get; set;
}
public virtual Member Sender
{
get; set;
}
public virtual string Subject
{
get;
set;
}
public virtual string Body
{
get; set;
}
}