我正在向我的表中插入一條記錄,但我希望能夠在插入時將我的 SortOrder字段設置爲SELECT MAX(SortOrder)+ 1 FROM Category Where SiteID = @SiteID。這樣做最簡單的方法是什麼?如何使用Linq執行NHibernate的執行時間查詢
這裏是我的數據結構:
類別
ID
SITEID
SortOrder的
名稱
我使用功能NHibernate和LINQ to NHibernate的。謝謝你的幫助!
我正在向我的表中插入一條記錄,但我希望能夠在插入時將我的 SortOrder字段設置爲SELECT MAX(SortOrder)+ 1 FROM Category Where SiteID = @SiteID。這樣做最簡單的方法是什麼?如何使用Linq執行NHibernate的執行時間查詢
這裏是我的數據結構:
類別
ID
SITEID
SortOrder的
名稱
我使用功能NHibernate和LINQ to NHibernate的。謝謝你的幫助!
好的,這裏有2種方法。最簡單的可以不涉及NHibernate的,因爲你使用SQL Server ...你可以只在您的表創建一個INSTEAD OF INSERT觸發器,就像這樣:
CREATE TRIGGER tgINSCategory ON Category INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON
INSERT INTO Category (SiteID, Name, SortOrder)
SELECT SiteID, Name,
ISNULL((SELECT MAX(c.SortOrder)
FROM Category c INNER JOIN INSERTED i ON c.SiteID = i.SiteID), 0) + 1
FROM INSERTED
END
在這第一個場景,你只想NHibernate的映射SortOrder的列作爲只讀(只需在流利的nhibernate類映射SortOrder屬性中添加一個.ReadOnly())。
第二種方法是使用NHibernate的內置功能,稱爲攔截器。使用攔截器,你可以在NHibernate通常生成SQL執行DML操作的時候運行任何你喜歡的代碼。下面的代碼會自動插入創建信息,但會與您需要的信息非常相似。 IInsertLoggable是一個自定義界面,它只是簡單列出了用於攔截的感興趣的屬性/列。
using System;
using System.Reflection;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate;
public class InsertDefaults : EmptyInterceptor {
private const string CREATED_BY = "CreatedById";
private Hashtable GetInsertLoggablePropertyIndexes(string[] Properties) {
Hashtable result = new Hashtable();
for (int i = 0; i < Properties.Length; i++) {
if (Properties[i] == CREATED_BY) {
result.Add(CREATED_BY, i);
break;
}
}
return result;
}
public override bool OnSave(object entity, object id, object[] state, string[] propertyNames, NHibernate.Type.IType[] types) {
if (entity is IInsertLoggable) {
Hashtable indexes = GetInsertLoggablePropertyIndexes(propertyNames);
state[(int)indexes[CREATED_BY]] = currentUser;
PropertyInfo createdByProp = entity.GetType().GetProperty(CREATED_BY);
if (createdByProp != null)
createdByProp.SetValue(entity, currentUser, null);
}
return base.OnSave(entity, id, state, propertyNames, types);
}
}
在我看來這種經典的觸發操作的可能應該住在數據庫上,我會用第一個選項去...
什麼是數據庫?在SQL中,您可以將該列設置爲自動增量列,並且您所描述的內容默認情況下會發生。 其他數據庫服務器也會做類似的事情。沒有必要的代碼來實現它。插入時,您不提供SortOrder的值。 – Cheeso 2010-06-18 22:12:42
它是SQL Server,但表中有子集,這就是我通過SiteID進行篩選的原因。 – 2010-06-19 03:40:19