Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
流利的NHibernate自动映射,简单问题,为外键关系添加额外字段_Nhibernate_Fluent Nhibernate_Automapping - Fatal编程技术网

流利的NHibernate自动映射,简单问题,为外键关系添加额外字段

流利的NHibernate自动映射,简单问题,为外键关系添加额外字段,nhibernate,fluent-nhibernate,automapping,Nhibernate,Fluent Nhibernate,Automapping,对不起,如果我说不通的话,我的脑子现在快炸了。我刚开始在NHibernate编程,由于自动映射,我决定转到Fluent NHibernate,但我遇到了一点麻烦,以下是它应该具有的关系: 以下是Fluent Nhibernate的自动映射关系,请注意,MemberId已添加到表中: 我猜这是因为在我的约定中,关系被设置为反向。我需要使关系反向()否则级联不起作用。以下是我的惯例: public class HasManyConvention : IHasManyConvention

对不起,如果我说不通的话,我的脑子现在快炸了。我刚开始在NHibernate编程,由于自动映射,我决定转到Fluent NHibernate,但我遇到了一点麻烦,以下是它应该具有的关系:

以下是Fluent Nhibernate的自动映射关系,请注意,MemberId已添加到表中:

我猜这是因为在我的约定中,关系被设置为反向。我需要使关系反向()否则级联不起作用。以下是我的惯例:

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