2009-02-08 14 views
19

मेरे सिस्टम में, मेरे पास दो इकाइयां हैं - शॉपिंगकार्ट और शॉपिंगकार्ट इटिम। काफी सामान्य उपयोग-मामला। हालांकि, जब मैं अपना शॉपिंगकार्ट सहेजता हूं, तो डीबी में कोई भी आइटम सहेजा नहीं जा रहा है।एनएचबेर्नेट: बाल वस्तुओं को बचाने के लिए फ्लुएंट निबर्ननेट का उपयोग

मेरी ऑब्जेक्ट में, मैं एक नया शॉपिंगकार्ट ऑब्जेक्ट बनाता हूं।

ShoppingCart cart = CreateOrGetCart(); 

मैं तब एक मौजूदा उत्पाद जोड़ता हूं जो मुझे डेटाबेस से शुरू में मिला।

cart.AddItem(product); 

यह आइटम को आईलीस्ट में जोड़ने के लिए बस एक साधारण आवरण है।

public virtual void AddItem(Product product) 
    { 
     Items.Add(new ShoppingCartItem { Quantity = 1, Product = product }); 
    } 

मैं तो भंडार

Repository.SaveOrUpdate(cart); 

कौन इस तरह दिखता है पर SaveOrUpdate फोन:

public T SaveOrUpdate(T entity) 
    { 
     Session.SaveOrUpdate(entity); 
     return entity; 
    } 

मैं धाराप्रवाह NHibernate का उपयोग कर रहा मानचित्रण के लिए:

public ShoppingCartItemMap() 
    { 
     WithTable("ShoppingCartItems"); 

     Id(x => x.ID, "ShoppingCartItemId"); 
     Map(x => x.Quantity); 

     References(x => x.Cart, "ShoppingCartId").Cascade.SaveUpdate(); 
     References(x => x.Product, "ProductId"); 
    } 


    public ShoppingCartMap() 
    { 
     WithTable("ShoppingCarts"); 

     Id(x => x.ID, "ShoppingCartId"); 
     Map(x => x.Created); 
     Map(x => x.Username); 

     HasMany<ShoppingCartItem>(x => x.Items) 
      .IsInverse().Cascade.SaveUpdate() 
      .WithKeyColumn("ShoppingCartId") 
      .AsBag(); 
    } 

डेटाबेस स्कीमा (एसक्यूएल सर्वर 2005) भी काफी सामान्य है:

CREATE TABLE [dbo].[ShoppingCarts] 
(
[ShoppingCartID] [int] NOT NULL IDENTITY(1, 1), 
[Username] [nvarchar] (50) NOT NULL, 
[Created] [datetime] NOT NULL 
) 
GO 
ALTER TABLE [dbo].[ShoppingCarts] ADD CONSTRAINT [PK_ShoppingCarts] PRIMARY KEY CLUSTERED ([ShoppingCartID]) 
GO 



CREATE TABLE [dbo].[ShoppingCartItems] 
(
[ShoppingCartItemId] [int] NOT NULL IDENTITY(1, 1), 
[ShoppingCartId] [int] NOT NULL, 
[ProductId] [int] NOT NULL, 
[Quantity] [int] NOT NULL 
) 
GO 
ALTER TABLE [dbo].[ShoppingCartItems] ADD CONSTRAINT [PK_ShoppingCartItems] PRIMARY KEY CLUSTERED ([ShoppingCartItemId]) 
GO 
ALTER TABLE [dbo].[ShoppingCartItems] ADD CONSTRAINT [FK_ShoppingCartItems_Products] FOREIGN KEY ([ProductId]) REFERENCES [dbo].[Products] ([ProductId]) 
GO 
ALTER TABLE [dbo].[ShoppingCartItems] ADD CONSTRAINT [FK_ShoppingCartItems_ShoppingCarts] FOREIGN KEY ([ShoppingCartId]) REFERENCES [dbo].[ShoppingCarts] ([ShoppingCartID]) 
GO 

जब मैं अपने ShoppingCart SaveOrUpdate, क्यों किसी भी ShoppingCartItems भी सहेजा नहीं जा रहा है?

कृपया मदद करें।

धन्यवाद

बेन

अद्यतन: किसी लेनदेन में यह रैपिंग मुझे कुछ अधिक जानकारी के साथ providng:

, टेबल 'ShoppingCartId' कॉलम में Null मूल्य सम्मिलित नहीं कर सकते 'WroxPizza .dbo.ShoppingCartItems '; कॉलम नल की अनुमति नहीं देता है। INSERT विफल रहता है। बयान समाप्त कर दिया गया है।

ऐसा इसलिए है क्योंकि यह एक नया कार्ट है।

+0

जेम्स ग्रेगरी समाधान ने मेरे लिए काम किया। –

उत्तर

1

सत्र को लपेटने का प्रयास करें। लेनदेन मेंaveOrUpdate, या सीधे बाद में फ्लश को मजबूर करें।

0

मुझे यकीन नहीं है, लेकिन मुझे नहीं लगता कि NHibernate वस्तुओं की वस्तुओं को बच्चों की वस्तुओं में सहेजता है। आप SaveOrUpdate को कॉल करने वाले कोड को नहीं दिखाते हैं, लेकिन मुझे पता है कि क्या आप उस समय शॉपिंग कार्ट इटम्स के माध्यम से लूप करते हैं, प्रत्येक को अलग-अलग सहेजते हैं तो वे भी बने रहेंगे।

0

मैं NHibernate (OPF मैं का उपयोग मेरे लिए यह करता है) के बारे में कुछ भी नहीं पता है, लेकिन नहीं यह मामला है कि जब आप (ShoppingCart) कुल जड़ को बचाने कि कोड भी करने के लिए अपने compositely स्वामित्व उदाहरणों के लिए प्रतिबद्ध होना चाहिए सत्र भी?

0

क्या यह संभव है कि आपके कार्ट आइटम पहले सहेजे जा रहे हों, फिर कार्ट? इसलिए बच्चे के सामान का उपयोग करने के लिए कोई मूल आईडी नहीं है?

आपको कार्ट को डीबी पर स्पष्ट रूप से सहेजने की ज़रूरत है, फिर इसमें आइटम जोड़ें और सहेजें - बस आईडी प्राप्त करने के लिए।

2

तुम क्यों लाइन

References(x => x.Cart, "ShoppingCartId").Cascade.SaveUpdate() 

में .Cascade.SaveUpdate() शामिल किया?

शायद यह एनएचबेर्नेट (या फ्लुएंट एनएचबेर्नेट) को भ्रमित करता है जो आपके संबंध के दोनों सिरों से बचाता/अपडेट करता है?

अपनी हैसनी को कैस्केड में कॉन्फ़िगर करना आपके इच्छित चीजों को प्राप्त करने के लिए पर्याप्त होना चाहिए।

3

मुझे धाराप्रवाह निबर्ननेट के साथ यह सटीक समस्या थी। एक-से-कई रिश्तों को मैप करने में एक छोटी सी बग दिखाई देती है और रिश्ते स्वचालित रूप से सहेजते या कैस्केडिंग नहीं करते हैं। See here for a posting about it on the Fluent NHibernate group

जाहिर है, इस मुद्दे पर कोई काम कर रहा है!

मैं यह सुनिश्चित नहीं कर सकता कि यह आपके कोड के साथ समस्या है लेकिन it looks very similar to a problem I had है। उम्मीद है कि कुछ मदद करता है!

-4

समस्या सत्रफैक्टरी के आपके कॉन्फ़िगरेशन स्टेटमेंट के साथ है। यदि आप अपना डेटा जारी रखना चाहते हैं तो Exposeconfiguration का उपयोग न करें। यह निश्चित रूप से डेटा दृढ़ता की आपकी समस्या को हल करेगा।

+0

स्कीमाएक्सपोर्ट का उपयोग ध्यान से किया जाना चाहिए। –

0

जैसा कि देखा गया है, आपने पहचान के साथ फ़ील्ड स्कीमा फ़ील्ड में परिभाषित किया है, इसलिए, इन फ़ील्ड को मानचित्र फ़ाइल में सेट किया जाना चाहिए। निम्नलिखित के रूप में उदाहरण:

Id(x => x.ID, "ShoppingCartItemId").GeneratedBy.Identity();

त्रुटि आप क्योंकि आप मानचित्रण में पहचान क्षेत्रों सेट नहीं किया हो रही है पहचान द्वारा उत्पन्न किया जा करने के लिए, इस प्रकार, आप को बचाने की कोशिश कर रहे हैं जब(), पहचान कॉलम उत्पन्न नहीं होता है (और डेटाबेस में शून्य नहीं है) तो यह आपको त्रुटि देता है।

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