2010-04-12 22 views
0

我正在更新程序並向數據庫添加新表。該程序使用Castle的ActiveRecord與存儲庫。我已經設置了類和存儲庫,並可以將測試用例從數據庫中取出。但是,當我嘗試向數據庫添加新記錄時,沒有任何反應。沒有錯誤,也沒有新的記錄。如果我將測試用例從數據庫中取出並更改某些內容,然後調用Save(),數據庫中的記錄將發生更改。Castle ActiveRecord Save()將更新但不會創建

這是我使用的測試代碼:

ICountryRepository _countryRepository = Country.GetRepository(site.Id); 

//get test case and update 
Country c = _countryRepository.FindById(1).Value; 
c.Name = "c"; 
_countryRepository.Save(c); 

//create new Country and save 
Country d = new Country(); 
d.Id = 2; 
d.Name = "d"; 
_countryRepository.Save(d); 

現在,因爲它沒有真正的時間停下來研究了城堡的框架是如何做的一切maintenence項目,我學習,我附和。我已經學習瞭如何通過研究其他代碼來完成工作,並且在代碼中有上述代碼用於創建新記錄的場合,所以我確定Save()是正確的調用函數。

我試着將代碼中的另一部分代碼插入到不同的表中,只是爲了確保沒有不同級別的權限。在我添加的表和基於我的代碼的表之間,數據庫沒有差異。正如我所說,我在ActiveRecord和Castle的框架的經驗很少,它可能會/很簡單。所以希望有人能向我指出。

謝謝。

編輯:

國家類別:

[ActiveRecord("Country")] 
[SearchEntity] 
public class Country : AbstractEntity<Country, ICountryRepository> 
{ 
    int _countryId; 
    string _name; 
    int _action; 

    [PrimaryKey("CountryId")] 
    public int Id 
    { 
     get { return _countryId; } 
     set { _countryId = value; } 
    } 

    [SearchProperty] 
    [Property(Length = 100)] 
    public string Name 
    { 
     get { return _name; } 
     set { _name = value; } 
    } 

    [Property] 
    public int PostRegisterActionId 
    { 
     get { return _action; } 
     set { _action = value; } 
    } 
} 

AbstractRepository因爲CountryRepository無助的時刻:

[Transient] 
public abstract class AbstractRepository<T> : IRepository<T> where T : AbstractEntity, new() 
{ 
    #region Private Vars 
    protected FutureQueryRunner _futureQueryRunner; 
    protected IDynamicSearchService _dynamicSearchService; 
    protected bool _caching; 
    protected int _cachedPages; 
    protected CachingFutureQueryOfList<T> _cachedQuery; 
    protected IServiceBus _serviceBus; 
    private string _entityTypeName = string.Empty; 
    #endregion 

    #region Constructors 
    public AbstractRepository(IDynamicSearchService dynamicSearchService, IServiceBus serviceBus) 
    { 
     _dynamicSearchService = dynamicSearchService; 
     _serviceBus = serviceBus; 
    } 
    #endregion 

    #region Public Methods 
    public virtual void Save(T instance) 
    { 
     ActiveRecordMediator<T>.Save(instance); 
    } 

    public virtual void Create(T instance) 
    { 
     ActiveRecordMediator<T>.Create(instance); 
    } 

    public void Delete(T instance) 
    { 
     ActiveRecordMediator<T>.Delete(instance); 
    } 

    public virtual IFutureQueryOf<T> New() 
    { 
     return new NullFutureQuery<T>(); 
    } 

    public virtual IFutureQueryOf<T> FindById(int id/*, params string[] eagerAssociations*/) // eager associations buggy 
    { 
     DetachedCriteria criteria = GetDefaultCriteria() 
       .Add(Expression.IdEq(id)); 

     /*foreach (string eager in eagerAssociations) 
      criteria.SetFetchMode(eager, NHibernate.FetchMode.Eager);*/ 

     return new FutureQueryOf<T>(_futureQueryRunner) 
      .SetCriteria(criteria); 
    } 

    public virtual IFutureQueryOfList<T> FindAll(string sortBy, bool sortAsc) 
    { 
     DetachedCriteria criteria = GetDefaultCriteria(); 

     if (!string.IsNullOrEmpty(sortBy)) 
      criteria.AddOrder(sortAsc ? NHibernate.Criterion.Order.Asc(sortBy) : NHibernate.Criterion.Order.Desc(sortBy)); 

     return new FutureQueryOfList<T>(_futureQueryRunner) 
      .SetCriteria(criteria); 
    } 

    public virtual IFutureQueryOfList<T> FindAll(int page, int resultsPerPage, string sortBy, bool sortAsc) 
    { 
     return FindAll(new DefaultCriteriaProvider<T>(DetachedCriteria.For<T>()), 
      page, 
      resultsPerPage, 
      sortBy, 
      sortAsc, 
      "FindAll"); 
    } 

    public virtual IFutureQueryOfList<T> FindAll(string searchString, int page, int resultsPerPage, string sortBy, bool sortAsc) 
    { 
     return FindAll(new SearchStringCriteriaProvider<T>(_dynamicSearchService, searchString), 
      page, 
      resultsPerPage, 
      sortBy, 
      sortAsc, 
      "FindAllSearchString_" + searchString); 
    } 

    public virtual IFutureQueryOfList<T> FindAll(IListFilter filter, int page, int resultsPerPage, string sortBy, bool sortAsc) 
    { 
     return FindAll(new FilterCriteriaProvider<T>(_dynamicSearchService, filter), 
      page, 
      resultsPerPage, 
      sortBy, 
      sortAsc, 
      "FindAllListFilter"); // TODO - the cache key needs to represent individual filters 
    } 

    public virtual IFutureQueryOf<int> GetCount(string searchString) 
    { 
     return new FutureQueryOf<int>(_futureQueryRunner) 
      .SetCriteria(AddDefaultCriteria(new SearchStringCriteriaProvider<T>(_dynamicSearchService, searchString).GetDetachedCriteria()) 
       .SetProjection(Projections.RowCount())); 
    } 

    public virtual IFutureQueryOf<int> GetCount() 
    { 
     return new FutureQueryOf<int>(_futureQueryRunner) 
      .SetCriteria(GetDefaultCriteria() 
       .SetProjection(Projections.RowCount())); 
    } 

    public virtual string EntityType 
    { 
     get 
     { 
      if (string.IsNullOrEmpty(_entityTypeName)) 
       _entityTypeName = typeof(T).Name; 
      return _entityTypeName; 
     } 
    } 

    public IRepository<T> EnableCaching(bool caching) 
    { 
     _caching = caching; 
     return this; 
    } 

    public IRepository<T> WithPagesToCache(int cachedPages) 
    { 
     _cachedPages = cachedPages; 
     return this; 
    } 

    public virtual IRepository<T> ForSite(int siteId) 
    { 
     return this; 
    } 

    public IRepository<T> RunFutureQueriesWith(FutureQueryRunner futureQueryRunner) 
    { 
     _futureQueryRunner = futureQueryRunner; 
     return this; 
    } 
    #endregion 

    #region Protected Methods 
    protected virtual DetachedCriteria AddDefaultCriteria(DetachedCriteria criteria) 
    { 
     return criteria; 
    } 
    protected DetachedCriteria GetDefaultCriteria() 
    { 
     return AddDefaultCriteria(DetachedCriteria.For<T>()); 
    } 
    protected IFutureQueryOf<U> NewQueryOf<U>(DetachedCriteria criteria) 
    { 
     return new FutureQueryOf<U>(_futureQueryRunner).SetCriteria(criteria); 
    } 
    protected IFutureQueryOfList<U> NewQueryOfList<U>(DetachedCriteria criteria) 
    { 
     return new FutureQueryOfList<U>(_futureQueryRunner).SetCriteria(criteria); 
    } 
    #endregion 

    #region Private Methods 
    private IFutureQueryOfList<T> FindAll(ICriteriaProvider<T> criteriaProvider, int page, int resultsPerPage, string sortBy, bool sortAsc, string cacheKey) 
    { 
     CachingFutureQueryOfList<T> rtnVal = null; 
     bool cached = false; 
     if (_cachedQuery != null && _caching) 
     { 
      rtnVal = _cachedQuery; 
      cached = rtnVal.SetPage(page, sortBy, sortAsc, cacheKey); 
     } 
     if (!cached) 
     { 
      rtnVal = new CachingFutureQueryOfList<T>(_futureQueryRunner, page, _cachedPages, resultsPerPage, cacheKey) 
       .SetCriteria(AddDefaultCriteria(criteriaProvider.GetDetachedCriteria()), sortBy, sortAsc); 

      if (_caching) 
       _cachedQuery = rtnVal; 
     } 
     return rtnVal; 
    } 
    #endregion 

    #region Criteria Providers 
    private interface ICriteriaProvider<U> 
    { 
     DetachedCriteria GetDetachedCriteria(); 
    } 

    private class DefaultCriteriaProvider<U> : ICriteriaProvider<U> 
    { 
     private DetachedCriteria _criteria; 
     public DefaultCriteriaProvider(DetachedCriteria criteria) 
     { 
      _criteria = criteria; 
     } 
     public DetachedCriteria GetDetachedCriteria() 
     { 
      return _criteria; 
     } 
    } 

    private class SearchStringCriteriaProvider<U> : ICriteriaProvider<U> 
    { 
     private IDynamicSearchService _searchService; 
     private string _searchString; 
     public SearchStringCriteriaProvider(IDynamicSearchService searchService, string searchString) 
     { 
      _searchService = searchService; 
      _searchString = searchString; 
     } 
     public DetachedCriteria GetDetachedCriteria() 
     { 
      return _searchService.GetDetachedCriteria<U>(_searchString); 
     } 
    } 

    private class FilterCriteriaProvider<U> : ICriteriaProvider<U> 
    { 
     private IDynamicSearchService _searchService; 
     private IListFilter _filter; 
     public FilterCriteriaProvider(IDynamicSearchService searchService, IListFilter filter) 
     { 
      _searchService = searchService; 
      _filter = filter; 
     } 
     public DetachedCriteria GetDetachedCriteria() 
     { 
      return _searchService.GetDetachedCriteria<U>(_filter); 
     } 
    } 
    #endregion 
} 

回答

2

如果你明確地設定了國家PK,因爲它似乎你'你可能需要調用Create()而不是Save()(我不知道你的存儲庫實現是否暴露了這個)。

如果這不起作用,請發佈您的類映射和存儲庫實現。

+0

Create()最初並不可用,但我已將它添加到抽象存儲庫中。現在它抱怨NULL CountryId,但問題中的代碼將其設置爲2,所以我不知道它爲什麼抱怨。該存儲庫只需調用ActiveRecordMediator .Save/Create()。我確信Save()必須完成這項工作,因爲它在代碼中的其他地方。哪些特定的代碼會有所幫助,所以我可以將它們添加到問題中? – Septih 2010-04-12 13:10:27

+0

類映射和存儲庫實現 – 2010-04-12 13:40:33

+0

已添加。那你想要什麼? – Septih 2010-04-12 14:42:29