NHibernate: การสร้างเกณฑ์ที่ใช้กับแบบสอบถามทั้งหมดบนตาราง

การใช้ Castle ActiveRecord / NHibernate: มีวิธีใดที่คุณสามารถบังคับใช้ ICriterion กับข้อความค้นหาทั้งหมดบนตารางได้หรือไม่

ตัวอย่างเช่น ตารางของฉันจำนวนมากมีคอลัมน์ "UserId" ฉันอาจต้องการให้แน่ใจว่าฉันเลือกแถวสำหรับผู้ใช้ที่เข้าสู่ระบบอยู่เสมอ ฉันสามารถสร้างวัตถุ ICriterion ได้อย่างง่ายดาย แต่ฉันถูกบังคับให้จัดหามันสำหรับวิธีการที่แตกต่างกัน: FindAll(), FindFirst(), FindLast() เป็นต้น

มีวิธีการบังคับใช้ส่วนคำสั่ง WHERE สำหรับการสืบค้นทั้งหมดไปยัง Castle ActiveRecord หรือไม่


person mbp    schedule 31.08.2009    source แหล่งที่มา


คำตอบ (2)


ในที่สุดฉันก็พบวิธีแก้ปัญหาที่ยอดเยี่ยม (โดยใช้ตัวกรอง) เนื่องจาก Castle AR ไม่มี API ดั้งเดิมสำหรับการแมปกับตัวกรอง NHibernate ส่วนนี้จึงค่อนข้างไม่มีเอกสาร ดังนั้นที่นี่ไป

ตัวกรองตัวอย่างนี้จะทำให้แน่ใจว่าคุณจะไม่ได้รับข่าวสารเกินหนึ่งปี ไม่ว่าคุณจะใช้แบบสอบถามประเภทใดใน ActiveRecord คุณอาจนึกถึงการใช้งานที่เป็นประโยชน์มากกว่านี้สำหรับสิ่งนี้

ขั้นแรก สร้าง ActiveRecord "ข่าว"

ใช้รหัสต่อไปนี้ก่อนที่คุณจะเตรียมใช้งาน ActiveRecordStarter

ActiveRecordStarter.MappingRegisteredInConfiguration += MappingRegisteredInConfiguration;
Castle.ActiveRecord.Framework.InterceptorFactory.Create = () => { return new EnableFiltersInterceptor(); };

จากนั้นเพิ่มฟังก์ชันและคลาสที่ขาดหายไป:

void MappingRegisteredInConfiguration(Castle.ActiveRecord.Framework.ISessionFactoryHolder holder)
{
    var cfg = holder.GetConfiguration(typeof (ActiveRecordBase));

    var typeParameters = new Dictionary<string, IType>
                                  {
                                    {"AsOfDate", NHibernateUtil.DateTime}
                                  };

    cfg.AddFilterDefinition(new FilterDefinition("Latest", "", typeParameters));

    var mappings = cfg.CreateMappings(Dialect.GetDialect(cfg.Properties));

    var newsMapping = cfg.GetClassMapping(typeof (News));
    newsMapping.AddFilter("Latest", ":AsOfDate <= Date");
}


public class EnableFiltersInterceptor : EmptyInterceptor
{
    public override void SetSession(ISession session)
    {
        session.EnableFilter("Latest").SetParameter("AsOfDate", DateTime.Now.AddYears(-1));
    }
}

แล้วก็เอาล่ะ! คำถามเกี่ยวกับข่าวเช่น FindAll(), DeleteAll(), FindOne(), Exists() ฯลฯ จะไม่แตะต้องรายการที่มีอายุเกินหนึ่งปี

person mbp    schedule 03.09.2009

สิ่งที่ใกล้เคียงที่สุดคือการใช้ตัวกรอง ดู http://ayende.com/Blog/archive/2009/05/04/nhibernate-filters.aspx

person Mauricio Scheffer    schedule 31.08.2009
comment
นี่ดูเหมือนจะเป็นวิธีแก้ปัญหาที่ดี แต่ฉันไม่สามารถทราบได้ว่าเป็นไปได้หรือไม่ที่จะใช้ตัวกรองเหล่านี้กับ Castle ActiveRecord - person mbp; 02.09.2009
comment
groups.google.com/group/castle-project- devel/browse_thread/ ฉันไม่คิดว่าสิ่งนี้เคยถูกนำมาใช้... คุณจะได้รับ ISession ปัจจุบันและเปิดใช้งานตัวกรองด้วยตัวเอง - person Mauricio Scheffer; 02.09.2009
comment
IIRC คุณสามารถรับ ISession ปัจจุบันได้จาก ActiveRecordMediator.GetSessionFactoryHolder().CreateSession(typeof(ActiveRecordBase)) - person Mauricio Scheffer; 02.09.2009
comment
ดูเหมือนว่าการเปิดใช้งานตัวกรองจะเป็นไปได้ แต่วิธีสร้างตัวกรองนั้นมีปัญหามากกว่า - person mbp; 03.09.2009