fluent-nhibernate autopping внешнего ключа вставляет ноль. - PullRequest
0 голосов
/ 04 сентября 2010

У меня есть класс с именем Worker

 public class Worker : BaseEntity
{
    public virtual int WorkerID { get; set; }
    public virtual string Name { get; set; }
    public virtual IList<Indemnification> Indemnifications { get; set; }
}

 public class Indemnification : BaseEntity
{
    public virtual int IndemnificationID { get; set; }
    public virtual string IndemnificationNumber { get; set; }
    //another properties
}

Я использую автоматическое сопоставление с некоторыми соглашениями

var mappings = new AutoPersistenceModel();
                 mappings.AddEntityAssembly(typeof(Worker).Assembly).Where(GetAutoMappingFilter);
        mappings.Conventions.Setup(GetConventions());
        mappings.Setup(GetSetup());

private Action<IConventionFinder> GetConventions()
    {
        return c =>
        {
            c.Add<PrimaryKeyConvention>();
            c.Add<HasManyConvention>();
            c.Add<TableNameConvention>();
            c.Add<CustomForeignKeyConvention>();
            c.Add<SubClassConvention>();
        };
    }


    public class PrimaryKeyConvention : IIdConvention
    {
        public void Apply(FluentNHibernate.Conventions.Instances.IIdentityInstance instance)
        {
            instance.Column(instance.EntityType.Name + "ID");
            instance.UnsavedValue("0");
        }
    }

    public class HasManyConvention : IHasManyConvention
    {
        public void Apply(FluentNHibernate.Conventions.Instances.IOneToManyCollectionInstance instance)
        {
            instance.Key.Column(instance.EntityType.Name + "ID");
            instance.Cascade.AllDeleteOrphan();
        }
    }

    public class TableNameConvention : IClassConvention
    {
        public void Apply(FluentNHibernate.Conventions.Instances.IClassInstance instance)
        {
            instance.Table(instance.EntityType.Name);
        }
    }

    public class CustomForeignKeyConvention : ForeignKeyConvention
    {
        protected override string GetKeyName(Member property, Type type)
        {
            return type.Name + "ID";
        }
    }

    public class SubClassConvention : IJoinedSubclassConvention
    {
        public void Apply(FluentNHibernate.Conventions.Instances.IJoinedSubclassInstance instance)
        {
            instance.Table(instance.EntityType.Name);
            instance.Key.Column(instance.EntityType.BaseType.Name + "ID");
        }

    }

проблема заключается в том, что я сохраняю Worker со списком компенсаций:работник сохраняется, и поэтому компенсации, но внешний ключ (WorkerID) в таблице компенсаций равен нулю ????

Ответы [ 2 ]

1 голос
/ 09 сентября 2010

Я выяснил проблему:

, когда вам нужно сохранить сущность, имеющую отношение (один ко многим), вам нужно открыть транзакцию и зафиксировать ее:).

Session.BeginTransaction();
Session.Save(entity);
Session.CommitTransaction();
0 голосов
/ 21 ноября 2010

Разве вы не удивляетесь, почему автоматическое сопоставление позволило внешним ключам, созданным для корабля отношений «один ко многим», быть в первую очередь нулевым?

Итак, в вашем примере почему столбец «workerId»"в таблице" Возмещение ущерба "не добавлено ограничение" не ноль "?

Я только что столкнулся с проблемой, и я думаю, что даже если это можно обработать в коде, это вообще не должно быть возможновставить нулевое значение, верно?Любое решение для этого?

...