我正在構建一個應用程序,允許用戶對對象進行更改,但更改必須經過批准後才能生效。我使用NHibernate。NHibernate堅持對象更改批准
你將如何處理這種情況下使用?有沒有解決這個問題的文章?
我想每個對象都有兩個表。一個用於當前狀態,一個用於建議的狀態。然後創建一個通用ChangeRequest對象來指定刪除/插入/更新以及想要更改的主題。但是,我不相信NHibernate會允許你爲同一個對象有兩個不同的映射。
我正在構建一個應用程序,允許用戶對對象進行更改,但更改必須經過批准後才能生效。我使用NHibernate。NHibernate堅持對象更改批准
你將如何處理這種情況下使用?有沒有解決這個問題的文章?
我想每個對象都有兩個表。一個用於當前狀態,一個用於建議的狀態。然後創建一個通用ChangeRequest對象來指定刪除/插入/更新以及想要更改的主題。但是,我不相信NHibernate會允許你爲同一個對象有兩個不同的映射。
兩個選項了我的頭頂部...
每個對象都可以有一個批准的標誌或經批准的日期。 (這可以封裝在一個通用的基類中)。你可能需要一個包含批准列的組合鍵(不推薦 - 組合鍵是一種痛苦),或者每個對象除了PK之外還可以有一個業務鍵。這意味着每個實體都有一個表,每個表中有一些額外的元數據列以確定已批准。 (您可以決定是保留所有更改還是僅保留最新內容。)
其他選項對於每個對象都是兩個單獨的表。您可以使用NH2.1中引入的實體名稱來完成此操作。最容易展示一個例子。我們只有一個類定義:
public class Foo {
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}
我們有兩個hbm.xml文件。請注意類之後的entity-name屬性。這會創建兩個表,Foo1和Foo2。 (您可以通過表格的屬性選擇自己的名字。)
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="NhHacking" assembly="NhHacking">
<class name="Foo" entity-name="Foo1">
<id name="Id">
<generator class="native" />
</id>
<property name="Name"/>
</class>
</hibernate-mapping>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="NhHacking" assembly="NhHacking">
<class name="Foo" entity-name="Foo2">
<id name="Id">
<generator class="native" />
</id>
<property name="Name"/>
</class>
</hibernate-mapping>
當我們拯救實體,我們提供的實體名稱與操作:
var foo1 = new Foo {Name = "Foo1"};
var foo2 = new Foo {Name = "Foo2"};
session.Save("Foo1", foo1);
session.Save("Foo2", foo2);
這允許您選擇哪個表該實體去。您當然想要將實體名稱封裝在常量類中。您需要爲所有操作(session.Get(),session.Save(),session.Update(),session.Delete()等)指定實體名稱。
對於您的情況,我會建議每個對象將具有以下設計:PropertyName,PropertyValue,PropertyStatus(propesed/approved)。通過這種設計,您可以在保持文件的一個映射的同時以任何方式更改對象。 例如,如果一個人的表應該有列SSN,姓名,出生日期....在此德興,你將有3行:它
In regular design ----------------- ColumnName ColumnValue ID 1 ssn 123 name xyz birthdate dd/mm/yyy This will be ------------ PropertyName PropertyValue ObjectID PropertyStatus ssn 123 1 approved name xyz 1 approved birthdate dd/mm/yyyy 1 approved
想象的那樣,如果它是一個垂直的表,其中行是列反之亦然。
我不知道你可以映射相同的類到兩個映射。這可能是我要處理它的方式。我可以在ChangeRequest對象映射文件中指定哪個實體名稱用於?這樣,我可以調用ChangeRequest 上的保存,它會將保存到等待審批表中。 –
awilinsk
2010-12-02 12:17:28