在CastleActiveRecord中不必要地更新

时间:2010-06-21 13:34:33

标签: c# castle-activerecord

我有两个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> {}

这表示可以在某些类型(Typ)的汽车中使用(使用)的汽车零件(产品)。

我在左侧的datagridview中使用gui产品,在右侧使用datagridview。在产品的OnSelectionChanged事件中我做了:

productUsagesDataGridView.DataSource = _currentProduct.Usages;

当我改变产品中的其他东西(不是用法)并致电:

_currentProduct.SaveAndFlush();

活动记录在每个产品的使用行上执行sql更新,并且在每个类型行上更加奇怪:/并且我100%确定我没有更改任何这些行。问题出现了,因为连接到db的用户没有表typ的更新权限,它应该保持这种状态。

也许有些人知道如何防止这种情况?

[解决]

无论如何,这是我的错。 Typ在数据库和ar模型中有created_at和modified_at列

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

因此,当在数据库中时,这些列有时可能为null,当我将它们加载到应用程序时,它们被设置为DateTime.Min。

解决方案是将模型中的字段类型更改为可为空:

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

1 个答案:

答案 0 :(得分:1)

有时可能会因映射不匹配而导致不需要的更新(有关此类案例的讨论和解决方案,请参阅this article)。

OTOH,如果Typ真的只读,您可能想在Mutable=false的{​​{1}} Typ中设置[ActiveRecord]