nhibernate: почему nhibernate обновляет внешний ключ моего дочернего объекта? - PullRequest
1 голос
/ 07 января 2010

Хорошо, у меня есть две сущности с именами WorkPostSheet и WorkPost, где WorkPostSheet содержит коллекцию WorkPost-элементов:

public class WorkPostSheet
{
    ...

    public virtual IEnumerable<WorkPost> WorkPosts
    {
        get;
        private set;
    }
}

В моем тесте интеграции я заметил, что nhibernate создает оператор обновления, который я не могу понять. Тест:

    [Test]
    public void Commit_CreateNewWorkPostSheetWithWorkPosts_WorkPostsPersisted()
    {
        using (IUnitOfWork unitOfWork = IsolatingFactory.CreateReadOnlyUnitOfWork())
        {
            // arrange
            WorkPostSheetRepository repository = new WorkPostSheetRepository(IsolatingFactory);
            WorkItemRepository workItemRepository = new WorkItemRepository(IsolatingFactory);

            DateTime from = new DateTime(2000, 1, 1);
            DateTime to = new DateTime(2000, 2, 1);
            WorkPostSheet sheetWithWorkPosts = WorkPostSheet.Create(TestData.CreateAndCommitUser("min", "Marius", "Ingjer", IsolatingFactory), new TimePeriod(from, to));

            WorkItem workItemToPostWorkOn = WorkItem.Create(0, "A");
            workItemRepository.Commit(workItemToPostWorkOn);

            WorkPost workPost = sheetWithWorkPosts.Add(workItemToPostWorkOn, from);

            // act
            repository.Commit(sheetWithWorkPosts);
            unitOfWork.Session.Flush();
            unitOfWork.Session.Clear();

            WorkPostSheet sheetWithWorkPostsFromDb = repository.Get(sheetWithWorkPosts.Id, false);

            // assert
            CollectionAssert.Contains(sheetWithWorkPostsFromDb.WorkPosts, workPost);
        }
    }

Выход:

NHibernate: INSERT INTO "Пользователь" (UserName, FirstName, LastName) VALUES (@ p0, @ p1, @ p2); select last_insert_rowid (); @ p0 = 'min', @ p1 = 'Marius', @ p2 = 'Ingjer'

Это имеет смысл, поскольку я создаю пользователя (TestData.CreateAndCommitUser)

NHibernate: INSERT INTO "WorkItem" (LastChanged, Description, Id) VALUES (@ p0, @ p1, @ p2); @ p0 = 06.01.2010 21:50:25, @ p1 = 'A', @ p2 = 0

Это имеет смысл, так как я создаю рабочий элемент

NHibernate: ВСТАВИТЬ В "WorkPostSheet" (PeriodFrom, PeriodTo, userId) VALUES (@ p0, @ p1, @ p2); выберите last_insert_rowid (); @ p0 = 01.01.2000 00:00:00, @ p1 = 01.02.2000 00:00:00, @ p2 = 1

Это имеет смысл, когда я создаю рабочий лист

NHibernate: INSERT INTO "WorkPost" (WorkDone, workItemId, sheetId) VALUES (@ p0, @ p1, @ p2); выберите last_insert_rowid (); @ p0 = 0, @ p1 = 0, @ p2 = 1

Это фиксируется в WorkPostRepository (лист рабочей записи является корневым объектом)

NHibernate: ОБНОВЛЕНИЕ SET "WorkPost" SET sheetId = @ p0 ГДЕ Id = @ p1; @ p0 = 1, @ p1 = 1

Теперь этого я не понимаю. Внешнее лицо обновляется с тем же значением, назначенным, когда объект был впервые зафиксирован. Можете ли вы помочь мне понять это?

NHibernate: ВЫБЕРИТЕ workpostsh0_.Id в качестве Id3_1_, workpostsh0_.PeriodFrom в качестве PeriodFrom3_1_, workpostsh0_.PeriodTo в качестве PeriodTo3_1_, workpostsh0_.userId в качестве userId3_1_ user_1, user_0_1_0_1_0_1_0_1_0_1_0_1_0_1_0_1 LastName as LastName0_0_ ИЗ «WorkPostSheet» workpostsh0_ внутреннее объединение «Пользователь» user1_ на workpostsh0_.userId = user1_.Id ГДЕ workpostsh0_.Id=@p0; @ p0 = 1

Загрузка из хранилища

NHibernate: ВЫБЕРИТЕ workposts0_.sheetId как sheetId2_, workposts0_.Id как Id2_, workposts0_.Id как Id2_1_, workposts0_.WorkDone как WorkDone2_1_, workposts0_.workItemId как workItemIpos1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1 LastChanged как LastChan2_1_0_, workitem1_. Описание как Descript3_1_0_ FROM WorkPost workposts0_ внутреннее соединение WorkItem workitem1_ на workposts0_.workItemId = workitem1_.Id WHERE workposts0_.sheetId=@ 10 @;

Ленивый груз

Вот файлы сопоставления:

sealed class WorkPostClassMap : ClassMap<WorkPost>
{
    public WorkPostClassMap()
    {
        Not.LazyLoad();

        Id(post => post.Id).GeneratedBy.Identity().UnsavedValue(0);
        Map(post => post.WorkDone);
        References(post => post.Item).Column("workItemId").Not.Nullable();
        References(Reveal.Property<WorkPost, WorkPostSheet>("Owner"), "sheetId").Not.Nullable();
    }
}

sealed class WorkPostSheetClassMap : ClassMap<WorkPostSheet>
{
    public WorkPostSheetClassMap()
    {
        Id(sheet => sheet.Id).GeneratedBy.Identity().UnsavedValue(0);
        Component(sheet => sheet.Period, period =>
                                             {
                                                 period.Map(p => p.From, "PeriodFrom");
                                                 period.Map(p => p.To, "PeriodTo");
                                             });
        References(sheet => sheet.Owner, "userId").Not.Nullable();
        HasMany(sheet => sheet.WorkPosts).KeyColumn("sheetId").AsBag();
    }
}

1 Ответ

1 голос
/ 07 января 2010

Вы установили для атрибута "инверсия" значение "true" для стороны сбора ассоциации?

См .: http://ayende.com/Blog/archive/2009/01/18/nh-prof-new-feature-superfluous-ltmany-to-onegt-update.aspx

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