Как правильно связать таблицу с элементом управления winforms? - PullRequest
1 голос
/ 02 марта 2012

Я отложил этот вопрос в течение некоторого времени, но теперь он беспокоит меня все время.У меня есть 2 класса (Эти классы автоматизированы - я опускаю public и virtual для краткости.):

class Cashier
{
    int Id {get; set;}
    string name{get; set;}
    IList<Site> Sites {get; set;}
}

class Site
{
    int Id{get; set;}
    string name {get; set;}
    Cashier Cashier {get; set;}
}

Я загружаю кассиров с этим:

sealed class Repository<T> : IRepository<T> where T :class
    {
        public IList<T> Items { get; private set; }

        public void Load()
        {
            Items.Clear();
            var session = SessionHelper.GetSession();
            session.Clear();
            using (var tx = session.BeginTransaction())
            {
                var list = session.Query<T>().ToList();

                foreach (var obj in list)
                {
                    Items.Add((T)session.Merge(obj));
                }

                session.Clear();
                tx.Commit();
            }
        }
//more
}

ив форме win я привязываю его к источнику привязки следующим образом:

cashierBindingSource.DataSource = Cashiers;

Я устанавливаю этот источник привязки в качестве источника данных в поле со списком, и когда я запускаю приложение и нажимаю на поле со списком, это исключение выдается мне:

Инициализация [HRProject.Model.Cashier # 1] - не удалось лениво инициализировать коллекцию ролей: HRProject.Model.Cashier.Sites, ни один сеанс или сеанс не был закрыт

Я обнаружил, что предоставление переопределения сопоставления устраняет эту проблему

mapping.HasMany(x => x.Sites).Not.LazyLoad().Cascade.All();

Однако у меня много таких классов, и у меня возникает ощущение, что есть более чистый способ сделать это.Есть идеи?

1 Ответ

0 голосов
/ 07 марта 2012

По моему опыту, связывание данных FNH, WinForms и отложенная загрузка - сложная смесь.

Если вам нужна отложенная загрузка, вам нужно держать сеанс открытым в течение всего срока службы формы.

Если вам это не нужно, вы можете отключить его.

Самый простой способ сделать это для всего проекта - использовать соглашение DefaultLazy:

.Conventions.Add( DefaultLazy.Never() )

Перейти к «Простейшим соглашениям» разделу вики, для этого и списку других.

Вот список из вики:

Table.Is(x => x.EntityType.Name + "Table")
PrimaryKey.Name.Is(x => "ID")
AutoImport.Never()
DefaultAccess.Field()
DefaultCascade.All()
DefaultLazy.Always()
DynamicInsert.AlwaysTrue()
DynamicUpdate.AlwaysTrue()
OptimisticLock.Is(x => x.Dirty())
Cache.Is(x => x.AsReadOnly())
ForeignKey.EndsWith("ID")

Предупреждение: некоторые имена методов в вики могут быть неверными.Я отредактировал вики с помощью того, что я мог проверить (то есть DefaultCascade и DefaultLazy), но не могу поручиться за остальное.Но вы должны быть в состоянии определить правильные имена с Intellisense, если возникнет такая необходимость.

...