2010-12-01 82 views
1

我正在構建一個應用程序,允許用戶對對象進行更改,但更改必須經過批准後才能生效。我使用NHibernate。NHibernate堅持對象更改批准

你將如何處理這種情況下使用?有沒有解決這個問題的文章?

我想每個對象都有兩個表。一個用於當前狀態,一個用於建議的狀態。然後創建一個通用ChangeRequest對象來指定刪除/插入/更新以及想要更改的主題。但是,我不相信NHibernate會允許你爲同一個對象有兩個不同的映射。

回答

1

兩個選項了我的頭頂部...

每個對象都可以有一個批准的標誌或經批准的日期。 (這可以封裝在一個通用的基類中)。你可能需要一個包含批准列的組合鍵(不推薦 - 組合鍵是一種痛苦),或者每個對象除了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()等)指定實體名稱。

+0

我不知道你可以映射相同的類到兩個映射。這可能是我要處理它的方式。我可以在ChangeRequest 對象映射文件中指定哪個實體名稱用於?這樣,我可以調用ChangeRequest 上的保存,它會將保存到等待審批表中。 – awilinsk 2010-12-02 12:17:28

0

對於您的情況,我會建議每個對象將具有以下設計: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 

想象的那樣,如果它是一個垂直的表,其中行是列反之亦然。