2012-08-24 29 views
13

हम इस तरह varchar और nvarchar अधिकतम कॉलम के साथ एक एसक्यूएल सर्वर तालिका है में एक VARCHAR (मैक्स) स्तंभ मैप करने के लिए कैसे:NHibernate hbm.xml मानचित्रण फ़ाइलें

CREATE TABLE [dbo].[MyTable](
    : 
    [MyBigUnicodeColumn] [nvarchar](max) NULL, 
    [MyBigAnsiColumn] [varchar](max) NULL, 
    : 

जब मानचित्रण बनाने (hbm.xml) फाइलें, documentation स्ट्रिंगक्लब को डेटाबेस प्रकार के DbType.String के साथ बड़ी ऑब्जेक्ट्स के प्रकार प्रकार के रूप में उपयोग करने का कहना है, लेकिन यह नहीं कहता कि डेटाबेस प्रकार DbType.AnsiString है या नहीं।

<class name="MyTable" table="MyTable" lazy="false"> 
    : 
    <property name="MyBigUnicodeColumn" type="StringClob" /> 
    <property name="MyBigAnsiColumn" type="????" /> 
    : 

यह NHibernate 3.3.1 के लिए है।

उत्तर

20

आप उन्हें string या AnsiString के रूप में मानचित्रित कर सकते हैं।

<property name="MyBigUnicodeColumn" type="string" length="1000000"/> 
<property name="MyBigAnsiColumn" type="AnsiString" length="1000000" /> 

जब भी लंबाई क्रमश तो 4000 या 8000 में बड़ा है, राष्ट्रीय राजमार्ग एक nvarchar (अधिकतम) या VARCHAR (अधिकतम) पैदा करता है।

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


संपादित: दुर्भाग्य से, यह एक ही AnsiString सामान्य तार के साथ के रूप में साथ काम नहीं करता। मैंने कुछ एनएच कोड पढ़े और निम्नलिखित पाया:

वर्कर (अधिकतम) SQL सर्वर 2005 से बोली द्वारा समर्थित है।

MsSql2000Dialect.cs, लाइन 205

RegisterColumnType(DbType.AnsiString, SqlClientDriver.MaxSizeForLengthLimitedAnsiString, "VARCHAR($l)"); 

MsSql2005Dialect.cs, रेखा 19:

RegisterColumnType(DbType.AnsiString, SqlClientDriver.MaxSizeForAnsiClob, "VARCHAR(MAX)"); 

यह varchar (max) पंजीकृत करता है एसक्यूएल प्रकार के रूप में जब एक AnsiString बड़ा मैप किया गया है चुनने के लिए तो 8000.

SqlClientDriver.cs में आप देख सकते हैं कि यह तारों के लिए पैरा में "ब्लब्स" लागू करता है, लेकिन ansi तारों (लाइन 135) के लिए नहीं:

case DbType.AnsiString: 
case DbType.AnsiStringFixedLength: 
    dbParam.Size = MaxSizeForLengthLimitedAnsiString; 
    break; 
// later on 
case DbType.String: 
case DbType.StringFixedLength: 
    dbParam.Size = IsText(dbParam, sqlType) ? MaxSizeForClob : MaxSizeForLengthLimitedString; 
    break; 

यह हमेशा 8000 को AnsiString प्रकार के पैरामीटर की सीमा के रूप में रखता है।

ड्राइवर और बोली के बीच असंगतता के कारण, मैं इसे एक बग कहूंगा।

क्योंकि सभी AnsiStrings पर बग होता है, यह मैपिंग में एसक्यूएल-प्रकार निर्दिष्ट करने में मदद नहीं करता है (एनएच सही एसक्यूएल प्रकार चुनने में सक्षम है)।https://nhibernate.jira.com/browse/NH-3252

+0

AnsiString परिभाषा के द्वारा एक गैर यूनिकोड स्ट्रिंग है, इसलिए इस टूट नहीं किया जाना चाहिए। मुझे लगता है कि यह केवल तभी बदल जाएगा जब भविष्य में एसक्यूएल सर्वर निर्दिष्ट लंबाई में स्ट्रिंग या एन्सी स्ट्रिंग को स्टोर करने के नए तरीकों की पेशकश करेंगे। –

+0

दूसरी तरफ, यह सभी बोलीभाषा में लागू किया गया है, और अपनी खुद की बोली रखना काफी आसान है। –

+0

यह आपके द्वारा उपयोग किए जा रहे एनएच संस्करण पर निर्भर करता है। एसक्यूएल सर्वर प्रश्नों का पुन: उपयोग करने के लिए पैरामीटर पारित करते समय वे लंबाई निर्दिष्ट करते हैं। SQL सर्वर क्लाइंट डेटा काटने के लिए उपयोग किया जाता था, जो बहुत खराब था, इसलिए लंबाई की जांच करें। यदि आप छेद 2 जीबी अधिकतम लंबाई का उपयोग करना चाहते हैं, तो इसे इस तरह निर्दिष्ट करें ... –

0

उपयोगकर्ता NHibernate (nhusers) मंच पर नेक्सस ने कहा::

<property name="MyBigAnsiColumn" type="StringClob" sql-type="VARCHAR(max)" /> 
Should be the most correct answer 

<property name="MyBigAnsiColumn" type="StringClob" sql-type="VARCHAR(max)" /> 

मैं एक बग के रूप में यह सूचना दी: आप वैकल्पिक हल thread you started on the NH forum में प्रस्तावित उपयोग करने की आवश्यकता

नोट: मैंने इसे सत्यापित नहीं किया है क्योंकि मैंने सभी VARCHAR (MAX) कॉलम को NVARCHAR (MAX) में बदलने का निर्णय लिया है।

1
public class Role 
{ 
    public Role() { } 
    public virtual string RoleId { get; set; } 
    public virtual string RoleName { get; set; } 
    public virtual string RoleDescription { get; set; } 
} 

public class RoleMap : ClassMapping<Role> 
{ 
    public RoleMap() 
    { 
     Table("nda_roles"); 
     Schema("dbo"); 
     Lazy(true); 
     Id(x => x.RoleId, map => 
     { 
      map.Column("role_id"); 
      map.Length(12); 
      map.Type((IIdentifierType)TypeFactory.GetAnsiStringType(12)); 
      map.Generator(Generators.Assigned); 
     }); 
     Property(x => x.RoleName, map => 
     { 
      map.Column("role_name"); 
      map.NotNullable(true); 
      map.Length(50); 
      map.Type(TypeFactory.GetAnsiStringType(50)); 
     }); 
     Property(x => x.RoleDescription, map => 
      { 
       map.Column("role_description"); 
       map.Length(NHibernateConfig.GetMaxLengthAnsiString()); 
       map.Type(TypeFactory.GetAnsiStringType(NHibernateConfig.GetMaxLengthAnsiString())); 
      }); 
    } 
} 


public static class NHibernateConfig 
{ 
    private static string driver_class; 
    private static string dialect; 

    public static ISessionFactory GetNHibernateSessionFactory() 
    { 
     var config = new Configuration().Configure(); // Read config from hibernate.cfg.xml 
     var configPath = HttpContext.Current.Server.MapPath(@"~\hibernate.cfg.xml"); 
     config.Configure(configPath); 
     driver_class = config.Properties["connection.driver_class"]; 
     dialect = config.Properties["dialect"]; 
     config.CurrentSessionContext<WebSessionContext>(); 

     var mapper = new ModelMapper(); 
     mapper.AddMappings(new Type[] 
     { 
      typeof(NDA.Models.RoleMap), 
      typeof(NDA.Models.PermissionMap), 
      typeof(NDA.Models.CompanyMap), 
      typeof(NDA.Models.UserMap), 
     }); 
     HbmMapping domainMapping = mapper.CompileMappingForAllExplicitlyAddedEntities(); 
     config.AddMapping(domainMapping); 

     new SchemaExport(config).Execute(false, true, false); 

     return config.BuildSessionFactory(); 
    } 

    public static int GetMaxLengthString() 
    { 
     int maxlenght = 255; 
     switch (driver_class) 
     { 
      case "NHibernate.Driver.SqlClientDriver": 
       switch (dialect) 
       { 
        case "NHibernate.Dialect.MsSql2008Dialect": 
         maxlenght = 4000; 
         break; 
       } 
       break; 
     } 
     return maxlenght; 
    } 

    public static int GetMaxLengthAnsiString() 
    { 
     int maxlenght = 255; 
     switch (driver_class) 
     { 
      case "NHibernate.Driver.SqlClientDriver": 
       switch (dialect) 
       { 
        case "NHibernate.Dialect.MsSql2008Dialect": 
         maxlenght = 8000; 
         break; 
       } 
       break; 
     } 
     return maxlenght; 
    } 

} 

और hibernate.cfg.xml फ़ाइल:

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" > 
<session-factory name="NHibernate.NDA"> 
    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property> 
    <property name="connection.connection_string_name">nda_connectionstring</property> 
    <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property> 
<property name="hbm2ddl.auto">validate</property> 
<mapping assembly="NDA"/> 

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