Свободное автоматическое отображение NHibernate, простой вопрос, добавляется дополнительное поле для отношений внешнего ключа - PullRequest
0 голосов
/ 10 марта 2011

Извините, если я не вижу смысла, мой мозг сейчас зажжен.Я только начал программировать в 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;
        }
    }

Почему беглый nhibernate отображает MemberId, когда очевидно, что Receiver и Sender являются внешними ключами для таблицы участника?

1 Ответ

1 голос
/ 10 марта 2011

Потому что Member.Mail отображается как один-ко-многим, что приводит к внешнему ключу в Mail. Никто никогда не говорил, что Member.Mail является обратным отношением, и никто никогда не говорил, как называется внешний ключ. Таким образом, он создает стандартный внешний ключ.

...