2010-01-04 14 views
6

मैं निम्नलिखित वर्ग है:चयन पर अद्यतन करने से रोकें?

public class Product 
{ 
    public virtual Guid Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual Decimal PricePerMonth { get; set; } 
    public virtual BillingInterval DefaultBillingInterval { get; set; } 
    public virtual string AdditionalInfo { get; set; } 
} 

और मानचित्रण इस तरह दिखता है:

<class name="Product" table="Products"> 
    <id name="Id" column="ProductId"> 
     <generator class="guid.comb"/> 
    </id> 
    <property name="Name" column="ProductName" not-null="true" type="String" /> 
    <property name="PricePerMonth" column="PricePerMonth" not-null="true" type="Decimal" /> 
    <property name="DefaultBillingInterval" type="int" not-null="true" /> 
    <property name="AdditionalInfo" type="string" not-null="false" /> 
</class> 

मैं निम्न विधि (Session एक संपत्ति है कि मौजूदा सत्र देता है) के साथ एक Repository<T> वर्ग का उपयोग करें:

public IEnumerable<T> FindAll(DetachedCriteria criteria) 
{ 
    return criteria.GetExecutableCriteria(Session).List<T>(); 
} 

अब जब मैं निम्नलिखित करता हूं (सत्र वही सत्र भंडार में उपयोग किया जाता है):

IEnumerable<ProductDTO> productDTOs = null; 
using(ITransaction tx = session.BeginTransaction(IsolationLevel.ReadCommitted)) 
{ 
    var products = repository.FindAll(new DetachedCriteria.For<Product>().Add(Restrictions.Like("Name", "Some Product%"))); 
    productDTOs = ToDTOs(products); 
    tx.Commit(); 
} 
// Do stuff with DTO's 

प्रतिबद्ध बयान नहीं है, क्योंकि मैं एक सेवा परत यदि कोई त्रुटियां हुईं जो स्वचालित रूप से हर लेन-देन करता है का उपयोग करें। मैं सिर्फ आसान दृश्य के लिए यहाँ मेरी सेवा परत ढह ..

मेरे ToDTOs विधि बस एक डीटीओ में धर्मान्तरित:

2010-01-04 19:13:11,140 [4] DEBUG NHibernate.SQL - SELECT ... From Products ... 
2010-01-04 19:13:11,237 [4] DEBUG NHibernate.SQL - UPDATE Products ... 
2010-01-04 19:13:11,548 [4] DEBUG NHibernate.SQL - UPDATE Products ... 
... 
का चयन करके

तो:

private IEnumerable<ProductDTO> ToDTO(IEnumerable<Product> products) 
{ 
    return products.Select(x => new ProductDTO() 
    { 
     Id = x.Id, 
     Name = x.Name, 
     PricePerMonth = x.PricePerMonth, 
     AdditionalInfo = x.AdditionalInfo 
    }).ToList(); 
} 

मेरे nhibernate लॉग निम्नलिखित उत्पादन से पता चलता उत्पाद जब यह काम करता है, तो प्रत्येक उत्पाद के लिए एक अद्यतन कथन जारी करता है, भले ही उत्पादों में कुछ भी नहीं बदला गया है ..

कोई विचार?

+0

क्या यह वास्तव में * इकाई को कैसे कार्यान्वित किया जाता है? मैं तुम पर विश्वास नहीं करता हूँ। –

+0

यह है ... सच है, मेरे पास ऑर्डर की एक सूची थी जिस पर उत्पाद संलग्न किया गया था, लेकिन मैंने कक्षा और मैपिंग (जैसे यहां दिखाया गया) दोनों से यह सूची हटा दी है और यह वही परिणाम है .. मेरा भ्रम इस तथ्य से और भी गहरा है कि यह मेरी अन्य संस्थाओं के साथ नहीं होता है .. –

उत्तर

7

मेरे पास केवल तब ही प्रभाव पड़ा जब मेरे पास ऐसी इकाई थी जो संपत्ति से वही मूल्य वापस नहीं देता है जो उससे सौंपा गया है। फिर इसे एनएच द्वारा गंदा माना जाता है।

उदाहरण:

class Foo 
{ 
    private string name; 

    public string Name 
    { 
    // does not return null when null had been set 
    get { return name ?? "No Name"; } 
    set { name = value; } 
    } 

} 

यह कैसे मैं मैपिंग फ़ाइल लिखना होता है।

<class name="Product" table="Products"> 
    <id name="Id" column="ProductId"> 
     <generator class="guid.comb"/> 
    </id> 
    <property name="Name" column="ProductName" not-null="true" /> 
    <property name="PricePerMonth" not-null="true" /> 
    <property name="DefaultBillingInterval" not-null="true" /> 
    <property name="AdditionalInfo" /> 
</class> 

आपको प्रकार निर्दिष्ट करने की आवश्यकता नहीं है। वे रनटाइम पर NHibernate द्वारा निर्धारित किए जाते हैं।

+0

आह, तो यह बिलिंग इंटरवल एनम होना चाहिए जो समस्या पैदा कर रहा है क्योंकि इसे int के रूप में मैप किया गया है? अद्यतन बयान के बिना मैं एक enum (int द्वारा समर्थित) कैसे मैप कर सकता हूं? –

+0

मैपिंग मैम करते समय आपको किसी भी प्रकार को निर्दिष्ट करने की आवश्यकता नहीं है। –

+0

क्या यह तब भी काम करता है जब डेटाबेस डिफॉल्ट बिलिंगिंग इंटरवल को एक छोटे से के रूप में संग्रहीत करता है (enum मानों में पूर्णांक मान 3,6,12 है)? –

1

पुरानी पोस्ट, लेकिन शायद यह सड़क के नीचे किसी की मदद करेगी।

मेरे पास डेटा रिपोजिटरी सी # क्लास लाइब्रेरी (डेटाबेस के रूप में ओरेकल) है। तालिका मूल्य शून्य था लेकिन मेरे रेपो में मूल्य को दशमलव के रूप में परिभाषित किया गया था और यह होना चाहिए था? दशमलव। चयन करते समय इस अद्यतन समस्या को ठीक किया गया।

+1

का उपयोग कर रहा था, तो मैं इसे कैसे ठीक करूँगा एक और परिदृश्य जहां आप एक अप्रत्याशित अद्यतन प्राप्त कर सकते हैं, जब डेटाबेस मैपिंग में कोई नई संपत्ति जोड़ा गया है और मैपिंग के पुराने संस्करण के साथ बनाए गए डेटाबेस से रिकॉर्ड पढ़ा जाता है। –

+0

जेम्स, जानना अच्छा है! –

संबंधित मुद्दे