使用db4o客戶端/服務器,更新不適用於對象的集合屬性。我使用透明持久性,但這沒有幫助。然後,我將Collection屬性更改爲ActivatableCollection,但沒有運氣。db4o透明持久不工作
這是服務器設置:
private void StartDatabase()
{
IServerConfiguration serverConfiguration = Db4oClientServer.NewServerConfiguration();
serverConfiguration.Networking.MessageRecipient = this;
serverConfiguration.Common.Add(new TransparentActivationSupport());
serverConfiguration.Common.Add(new TransparentPersistenceSupport());
string db4oDatabasePath = AppDomain.CurrentDomain.BaseDirectory;
string db4oDatabaseFileName = ConfigurationManager.AppSettings["db4oDatabaseFileName"];
int databaseServerPort = Convert.ToInt32(ConfigurationManager.AppSettings["databaseServerPort"], CultureInfo.InvariantCulture);
_db4oServer = Db4oClientServer.OpenServer(serverConfiguration, db4oDatabasePath + db4oDatabaseFileName, databaseServerPort);
string databaseUser = ConfigurationManager.AppSettings["databaseUser"];
string databasePassword = ConfigurationManager.AppSettings["databasePassword"];
_db4oServer.GrantAccess(databaseUser, databasePassword);
}
這是我要救實體:
這是應用程序的實體中的屬性:
public ActivatableCollection<TaskBase> Tasks { get; private set; }
這是更新集合中每個對象的客戶端代碼:
Application application = (from Application app in db
where app.Name == "Foo"
select app).FirstOrDefault();
foreach (TaskBase task in application.Tasks)
{
task.Description += ".";
}
db.Store(application);
奇怪的是,db.Commit()也沒有工作。
有兩種解決方法,但我寧願這樣做的「正確」的方式。
解決方法1:在更改每個任務時調用db.Store(任務)。
變通辦法2:調用db.Store(),在此之前:
db.Ext().Configure().UpdateDepth(5);
誰能告訴我,爲什麼名單沒有更新?
如果有幫助,這裏是ActivatableCollection類:
public class ActivatableCollection<T> : Collection<T>, IActivatable
{
[Transient]
private IActivator _activator;
/// <summary>
/// Activates the specified purpose.
/// </summary>
/// <param name="purpose">The purpose.</param>
public void Activate(ActivationPurpose purpose)
{
if (this._activator != null)
{
this._activator.Activate(purpose);
}
}
/// <summary>
/// Binds the specified activator.
/// </summary>
/// <param name="activator">The activator.</param>
public void Bind(IActivator activator)
{
if (_activator == activator) { return; }
if (activator != null && null != _activator) { throw new System.InvalidOperationException(); }
_activator = activator;
}
}
通過大量的試驗和錯誤,以及RTFM,我進展緩慢。我發現我沒有使用透明持久性。看來服務器和客戶端配置需要TransparentPersistenceSupport配置。而且我錯過了我必須致電每個實體的每個獲取器和設置器的地方。不是很透明... –
這樣做意味着我必須爲每個屬性實現手動獲取和設置器。域實體應該對持久層一無所知,但這種方法在每個實體上都有db4o代碼。明確保存每個對象可能會更容易。我會這樣做,如果我能弄清楚爲什麼添加一個新的對象到現有的列表不會持久對象和父對象之間的關聯。例如:Foo有屬性列表。當我做Bars.Add(新酒吧())時,新酒吧被存儲,但它不與Foo關聯。 –