流畅的NHibernate atutomapping,简单的问题,为外键关系添加额外的字段

时间:2011-03-10 13:15:59

标签: nhibernate fluent-nhibernate automapping

对不起,如果我没有任何意义,我的大脑现在就被炸了。我刚刚开始在NHibernate中编程,因为自动化而决定转向Fluent Nhibernate,但我遇到了一些麻烦,这里应该有它的关系:

enter image description here

这是Fluent Nhibernate自动化的关系,注意到MemberId被添加到表中: enter image description here

我猜这是因为我的约定中的关系设置为反转。我需要使关系逆()或级联不起作用。以下是我的惯例:

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");
        }
    }

我的两个实体:

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;
        }
    }

当Receiver和Sender显然是成员表的外键时,为什么流利的nhibernate映射成员ID?

1 个答案:

答案 0 :(得分:1)

因为Member.Mail被映射为一对多,导致Mail中的外键。没有人说'Member.Mail'是反向关系,没有人说过如何调用外键。所以它创建了一个标准的外键。