Проблема при сопоставлении отношения «Многие к MapObject to Many» в Fluent NHibernate - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть общий корень Администрации.Администрация объекта имеет отношение 1 к многим с формами.У форм есть то, что ЗАКРЫТЬ, чтобы быть отношением многие ко многим с модулями, однако в ссылке есть свойство, поэтому я создал объект отображения с именем FormModule, у которого есть свойство для целого числа Sequence.

IЯ искал настройки конфигурации Cascade & Inverse, но я не могу найти правильную комбинацию, которая позволит мне сохранить новый объект Administration со всеми его зависимыми объектами.Я использую составной ключ в таблице FormModule, но KeyReference, похоже, не имеет никаких средств для его установки для сохранения модулей, и я получаю сообщение об ошибке

объект ссылается нанесохраненный временный экземпляр - сохраните временный экземпляр перед сбросом или задайте каскадное действие для свойства, которое сделает его автоматически сохраненным.Тип: Модуль

Вот код для классов

public class Administration 
{        
    public virtual int AdministrationId { get; protected set; }

    protected IList<Form> _forms = new List<Form>();
    public virtual IList<Form> Forms
    {
        get { return _forms; }
    }                        
}

public class Form 
{
    public virtual int Id { get; set; }
    public virtual Administration AdminKey { get; protected set; }
    protected IList<FormModule> _formModules = new List<FormModule>();
    public virtual IList<FormModule> FormModules
    {
        get { return _formModules; }
    }
}

public class Module 
{
    public virtual int Id { get; protected set; }
    public virtual Administration AdminKey { get; protected set; }
    protected IList<FormModule> _formModules = new List<FormModule>();
    public virtual IList<FormModule> FormModules
    {
        get { return _formModules; }
    }
}

public class FormModule 
{       
    public virtual Form Form { get; protected set; }
    public virtual Module Module { get; protected set; }
    public virtual int Sequence { get; protected set; }        
}

И вот код для конфигурации Fluent NHibernate

public class AdministrationMap : ClassMap<Administratio>
{
    public AdministrationMap()
    {            
        Id(x => x.Id)
            .Column("AdministrationId")
            .Not.Nullable()
            .GeneratedBy.Identity();

        HasMany(x => x.Forms)
            .KeyColumn("AdministrationId")                
            .Cascade.All();            
    }
}

public class FormMap : ClassMap<Form>
{
    public FormMap()
    {            
        Id(x => x.Id)
            .Column("FormId")
            .Not.Nullable()
            .GeneratedBy.Identity();

        HasMany(x => x.FormModules)
         .Cascade.All()

        References(x => x.Administration).Column("AdministrationId").Not.Nullable();
    }
}

public class ModuleMap : ClassMap<Module>
{
    public ModuleMap()
    {
        Id(x => x.Id)
            .Column("ModuleId")
            .Not.Nullable()
            .GeneratedBy.Identity();

        HasMany(x => x.FormModules)
            .Cascade.All();
            //.Inverse()  //try this;

        References(x => x.Administration).Column("AdministrationId").Not.Nullable();
    }
}

public class FormModuleMap : ClassMap<FormModule>
{
    public FormModuleMap()
    {
        CompositeId()
          .KeyReference(x => x.Form, "FormId")
          .KeyReference(x => x.Module, "ModuleId");

        Map(x => x.Sequence)
            .Column("SequenceNumber");

        //I've tried these
        //References(x => x.Module).Column(FormModuleTable.Column.FormId).Not.Nullable().Cascade.All();
        //References(x => x.Module).Column(FormModuleTable.Column.ModuleId).Not.Nullable();
    }
}

Кто-нибудь видит, почему яполучаю эту ошибку?

1 Ответ

0 голосов
/ 19 марта 2019

в общем, этот полный код выглядит для меня странно, но тем не менее

public virtual Module Module { get; protected set; }

Как вы запускаете FormModule?Пожалуйста, отправьте код, который вы делаете это.В противном случае я бы сказал, что если вы не установите value to Модуль of Formmodule the value is null and so nhibernate tells you that it's null или transient``

var formModule = new FormModule ();
formModule.Module = new Module(); //// this doesn't work with your code because of your protected setter

Imho, ваше отображение корректно (кроме того, что составные ключи никогда не бываютхорошая идея)

Если вы сделаете module с открытым сеттером, вы не должны получить никаких ошибок с моим кодом, упомянутым выше

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...