Излишне обновления в CastleActiveRecord - PullRequest
0 голосов
/ 21 июня 2010

У меня есть два класса ActiveRecord

 class Product : ActiveRecordBase<Product>
 {
     private IList<Usage> _usages = new List<Usage>();
     ...
     [HasMany(
   ColumnKey="produkt_id",
   Inverse=true, 
          Cascade=ManyRelationCascadeEnum.None)]
     public IList<Usage> Usages
     {
       get { return _usages; }
       set { _usages = value; }
     }
     ...         
 }

 class Usage : ActiveRecordBase<Usage>
 {
     private Product _product;
     [BelongsTo("product_id")]
     public Product Product
     {
         get { return _product; }
         set { _product = value; }
     }

     private Typ _typ;
     [BelongsTo("typ_id")]
     public Typ
     {
         get { return _typ; }
         set { _typ = value; }
     }
 }

 public class Typ : ActiveRecordBase<Typ> {}

Представляет автомобильные детали (продукты), которые могут использоваться (использоваться) в некоторых типах (типовых) автомобилей.

У меня есть графический интерфейс с продуктами в datagridview на левой стороне и использует datagridview на правой стороне. В событии OnSelectionChanged в продуктах я делаю:

productUsagesDataGridView.DataSource = _currentProduct.Usages;

И когда я изменил некоторые другие вещи в продукте (не употребления) и позвонил:

_currentProduct.SaveAndFlush();

активная запись выполняет обновления sql для каждой строки использования продукта и, что еще более странно, для каждой строки типа: / И я на 100% уверен, что не изменил ни одну из этих строк. Проблема возникла из-за того, что у пользователя, который подключается к базе данных, нет прав на обновление типа таблицы, и он должен оставаться таким.

Может быть, некоторые из вас знают, как я могу предотвратить это?

[Решение]

Случилось так, что это была моя вина. Тип имеет столбцы созданного и измененного в базе данных и в модели ar

DateTime CreatedAt { get; set; }
DateTime ModifiedAt { get; set; }

поэтому, когда в базе данных эти столбцы иногда могут быть нулевыми, когда я загружал их в приложение, им было присвоено значение DateTime.Min.

Решение состоит в том, чтобы изменить типы полей в модели на nullable:

DateTime? CreatedAt { get; set; }
DateTime? ModifiedAt { get; set; }

1 Ответ

1 голос
/ 21 июня 2010

Нежелательные обновления могут быть вызваны иногда несоответствиями сопоставления (см. в этой статье для обсуждения и решения одного такого случая).

OTOH, если Typ действительно только для чтения, вы можете захотетьустановить Mutable=false в Typ [ActiveRecord]

...