2012-06-23 6 views
8

मैं निम्नलिखित कॉलम के साथ एक मेज है:पेटापोको कक्षा को गैर-संख्यात्मक कॉलम समेत समग्र कुंजी के साथ काम करने के लिए कैसे संशोधित करें?

ContractorId ......... INT ............. पहचान
ContractorName ........ vARCHAR (50) ....... पी
ContractorGrade ....... vARCHAR (3) ....... पी

वर्ग PetaPoco टी -4 टेम्पलेट द्वारा उत्पन्न इस तरह दिखता है:

[TableName("contractor_master")] 
[PrimaryKey("contractorname", autoIncrement=false)] 
[ExplicitColumns] 
public partial class contractor_master : TubewellRepo.Record<contractor_master> 
{ 
    [Column] 
    public int contractorid 
    { 
     get 
     { 
      return _contractorid; 
     } 
     set 
     { 
      _contractorid = value; 
      MarkColumnModified("contractorid"); 
     } 
    } 
    int _contractorid; 

    [Column] 
    public string contractorname 
    { 
     get 
     { 
      return _contractorname; 
     } 
     set 
     { 
      _contractorname = value; 
      MarkColumnModified("contractorname"); 
     } 
    } 
    string _contractorname; 

    [Column] 
    public string contractorgrade 
    { 
     get 
     { 
      return _contractorgrade; 
     } 
     set 
     { 
      _contractorgrade = value; 
      MarkColumnModified("contractorgrade"); 
     } 
    } 
    string _contractorgrade; 
    } 

एक नया रिकॉर्ड सम्मिलित करने के लिए कोड के रूप में नीचे है:

// Insert a record 
var Contractor=new contractor_master(); 
Contractor.contractorname = "Super Borewells"; 
Contractor.contractorgrade = "A"; 

db.Insert(Contractor); 

कक्षा कोड की दूसरी पंक्ति में, मैं जानना चाहता हूं कि एक समग्र कुंजी का उल्लेख कैसे करें, जो (ठेकेदार नाम + ठेकेदार ग्रेड) है।

दूसरा, यह रिकॉर्ड नहीं डाल रहा है क्योंकि यह एक आईडी कॉलम की अपेक्षा करता है। भले ही ठेकेदार आईडी पहचान है, यह प्राथमिक कुंजी नहीं है।

यह एक नया रिकॉर्ड शामिल नहीं है और त्रुटि देता है क्योंकि यह पहचान कॉलम में 0 डाल रहा है।

+0

यदि आपके पास पहले से ही 'ठेकेदार आईडी' कॉलम है, तो पेटापोको इसे प्राथमिक कुंजी के रूप में क्यों नहीं उपयोग करता है? आप अभी भी डीबी में समग्र कुंजी रख सकते हैं। –

+0

ठीक है। लेकिन सिर्फ यह जानना चाहता था कि पेटापोको ने समग्र कुंजी का समर्थन किया है या नहीं। – RKh

उत्तर

7

मेरे यहाँ शाखा:

[PrimaryKey("ContractorName,ContractorGrade")] 

मुझे यकीन है कि यह कैसे करता है, तो आप के रूप में अच्छी वहाँ पहचान स्तंभ चाहते काम करेंगे नहीं कर रहा हूँ: https://github.com/schotime/petapoco तरह PrimaryKey गुण निर्दिष्ट करने के द्वारा समग्र प्राथमिक कुंजी का समर्थन करता है।

+1

मैंने कोशिश की लेकिन इसमें IsNew (..) विधि के लिए समर्थन की कमी है, क्या आप इस पर अपडेट कर सकते हैं? – Bonefisher

+0

अच्छा! मुझे आश्चर्य है कि इस बार के बाद यह मुख्य परियोजना में वापस नहीं खींच लिया गया है। – jpoh

2

मैं IsNew समर्थन करने के लिए निम्न परिवर्तन करना था()

// Check if a poco represents a new record 
     public bool IsNew(string primaryKeyName, object poco) 
     { 
      var pd = PocoData.ForObject(poco, primaryKeyName); 
      object pk; 
      PocoColumn pc; 
      if (pd.Columns.TryGetValue(primaryKeyName, out pc)) 
      { 
       pk = pc.GetValue(poco); 
      } 
#if !PETAPOCO_NO_DYNAMIC 
      else if (poco.GetType() == typeof(System.Dynamic.ExpandoObject)) 
      { 
       return true; 
      } 
#endif 
      else if (primaryKeyName.Contains(",")) 
      { 
       return primaryKeyName.Split(',') 
        .Select(pkPart => GetValue(pkPart, poco)) 
        .Any(pkValue => IsDefaultOrNull(pkValue)); 
      } 
      else 
      { 
       pk = GetValue(primaryKeyName, poco); 
      } 

      return IsDefaultOrNull(pk); 
     } 

     private static object GetValue(string primaryKeyName, object poco) 
     { 
      object pk; 
      var pi = poco.GetType().GetProperty(primaryKeyName); 
      if (pi == null) 
       throw new ArgumentException(
        string.Format("The object doesn't have a property matching the primary key column name '{0}'", 
            primaryKeyName)); 
      pk = pi.GetValue(poco, null); 
      return pk; 
     } 

     private static bool IsDefaultOrNull(object pk) 
     { 
      if (pk == null) 
       return true; 

      var type = pk.GetType(); 

      if (type.IsValueType) 
      { 
       // Common primary key types 
       if (type == typeof(long)) 
        return (long)pk == default(long); 
       else if (type == typeof(ulong)) 
        return (ulong)pk == default(ulong); 
       else if (type == typeof(int)) 
        return (int)pk == default(int); 
       else if (type == typeof(uint)) 
        return (uint)pk == default(uint); 
       else if (type == typeof(Guid)) 
        return (Guid)pk == default(Guid); 

       // Create a default instance and compare 
       return pk == Activator.CreateInstance(pk.GetType()); 
      } 
      else 
      { 
       return pk == null; 
      } 
     } 
+0

वास्तव में IsNew का उपयोग यह तय करने के लिए किया जाता है कि एक सम्मिलित या अद्यतन की आवश्यकता है या नहीं। पेटापोको में यह कहता है कि "IsNew() और Save() केवल ऑटो-वृद्धि/पहचान प्राथमिक कुंजी कॉलम वाले तालिकाओं पर समर्थित हैं" मुझे विश्वास है कि इसे समग्र कुंजी के लिए ऑटो वृद्धि के रूप में कई अन्य कामों की आवश्यकता है/यह देखने के लिए चयन करें कि यह है या नहीं असली के लिए एक नई कुंजी। संशोधित करने के लिए इस विधि की आवश्यकता नहीं है – mkb

0

मैं देख सकता हूँ यह है कि CompositeKeySuppport branch अब, इसलिए यह एक अच्छा मौका है कि हम इस जल्द ही आधिकारिक रेपो में समर्थन किया है और कुछ नहीं भेजेंगे, जिसका अर्थ है हम NuGet अपडेट और सामान प्राप्त करेंगे।

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