Nhibernate и случай автоматического обновления сущностей - PullRequest
0 голосов
/ 21 января 2012

Лучший титул, который я мог придумать, однако, немного более сложный.

// Hit the database once and get all the categories;
IQueryable<Category> qryCategoryList = _repository.Select<Category>();

// get initial parents
var parentCategories = qryCategoryList.Where(x => x.ParentCategoryId == null);
foreach (Category parentCategory in parentCategories)
{
    HttpContext.Current.Response.Write(parentCategory.CategoryName = "This should not happen");
            BuildCategoryList(qryCategoryList, parentCategory.CategoryId);
}

Эта строка

 HttpContext.Current.Response.Write(parentCategory.CategoryName = "This should not happen");

выполняет это

UPDATE Categories
SET    ParentCategoryId = NULL /* @p0_0 */,
       CategoryName = '->' /* @p1_0 */,
       CategoryDescription = 'The Fruit Category' /* @p2_0 */,
       Active = 1 /* @p3_0 */,
       DateCreated = '2012-01-20T12:03:41.00' /* @p4_0 */,
       LastUpdated = '2012-01-20T12:03:41.00' /* @p5_0 */
WHERE  CategoryId = 'aa8ca9ba-663c-45c8-950b-159a28e6635d' /* @p6_0 */

Я не звоню сохранить из своего репозитория, не желая делать обновление. Как это возможно?

РЕДАКТИРОВАТЬ: Вот отображение

 public class CategoryMap : ClassMap<Category>
{
    public CategoryMap()
    {
        Table("Categories");
        LazyLoad();
        Id(x => x.CategoryId).GeneratedBy.GuidComb().Column("CategoryId");
        Map(x => x.ParentCategoryId).Column("ParentCategoryId");
        Map(x => x.CategoryName).Column("CategoryName").Not.Nullable().Length(50);
        Map(x => x.CategoryDescription).Column("CategoryDescription").Not.Nullable();
        Map(x => x.Active).Column("Active").Not.Nullable();
        Map(x => x.DateCreated).Column("DateCreated").Not.Nullable();
        Map(x => x.LastUpdated).Column("LastUpdated").Not.Nullable();
        HasMany(x => x.PostingsCategories).KeyColumn("CategoryId");
    }
}

1 Ответ

2 голосов
/ 21 января 2012

Обычно это происходит, когда что-то в отображении или объявлении объекта не совсем совпадает с тем, что находится в базе данных. Например, у вас может быть UNIQUEIDENTIFIER в базе данных, которая может быть обнуляемой, но отображать ее в необнуляемом Guid на объекте. NHibernate выбирает, видит Guid.Empty вместо NULL и говорит: «Эй! Объект изменился! Воткни, послушай, я должен обновить его ...»

Это всего лишь один случай того, как это может произойти. Если вы опубликуете свое сопоставление, мы сможем помочь вам отладить его немного дальше.

-

На самом деле, я должен был прочитать это немного дальше. Если это входит в объем транзакции, NHibernate автоматически обновит любые измененные объекты, не требуя явного вызова SaveOrUpdate(). Он называется автозаполнением и включен по умолчанию. Вам нужно установить FlushMode на Never, если вы хотите явно вызвать transaction.Commit() или session.Flush().

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