2010-02-26 12 views
12

मैं निम्नलिखित मानचित्रण है के बजाय होने के लिए:सेटिंग स्ट्रिंग "varchar" की एसक्यूएल प्रकार "nvarchar"

public class LogEntryMap 
{ 
    public LogEntryMap() 
    { 
     Map.Id(x => x.Id).GeneratedBy.Identity(); 
     Map(x => x.Context).CustomSqlType("varchar").Length(512); 
    } 
} 

हालांकि, एसक्यूएल सर्वर 2008 में डेटाबेस उत्पन्न करने के लिए SchemaExport का उपयोग कर, स्क्रिप्ट उत्पन्न लंबाई पर ध्यान नहीं देता इतना प्रभाव में यह 1 की लंबाई के साथ एक varchar किया जा रहा समाप्त होता है:

create table OV_SAC.dbo.[LogEntry] (
    Id BIGINT IDENTITY NOT NULL, 
    Context varchar null, 
    primary key (Id) 
) 

.CustomSqlType("varchar 512") एक अपवाद फेंकता है। और CustomSqlType को परिभाषित किए बिना, तारों को nvarchar पर मैप किया गया है (जो Length संपत्ति का सम्मान करता है)।

कोई सुझाव?

उत्तर

22

उपयोग .CustomType("AnsiString") डिफ़ॉल्ट "String" और NHibernate के बजाय varchar बजाय nvarchar का प्रयोग करेंगे।

8

दोह।

Map(x => x.Context).CustomSqlType("varchar (512)"); 

create table OV_SAC.dbo.[LogEntry] (
    Id BIGINT IDENTITY NOT NULL, 
    Context varchar (512) null, 
    primary key (Id) 
) 
16

आप चाहता है तो सभी अपने तार के nvarchar के बजाय VARCHAR करने के लिए आप एक सम्मेलन के उपयोग पर विचार कर सकता है मैप किया:

/// <summary> 
/// Ensures that all of our strings are stored as varchar instead of nvarchar. 
/// </summary> 
public class OurStringPropertyConvention : IPropertyConvention 
{ 
    public void Apply(IPropertyInstance instance) 
    { 
     if (instance.Property.PropertyType == typeof (string)) 
      instance.CustomType("AnsiString"); 
    } 
} 

आप मैपिंग तो एक सरल मानचित्रण करने के लिए वापस जा सकते हैं:

:
Map(x => x.Context); 

बस सुनिश्चित करें कि आप सम्मेलन उपयोग करने के लिए सुविज्ञ राष्ट्रीय राजमार्ग को बताने के लिए याद करना

 var configuration = new Configuration(); 
     configuration.Configure(); 
     Fluently 
      .Configure(configuration) 
      .Mappings(m => m.FluentMappings 
       .AddFromAssemblyOf<Widget>() 
       .Conventions.Add<OurStringPropertyConvention>() 
       ) 
      .BuildSessionFactory(); 
+0

ग्रेट !! अब, अगर मैं अपने सभी गुणों को वर्चर के रूप में चाहता हूं, तो एक को छोड़कर? क्या मैं सम्मेलन द्वारा ओवरराइट किए बिना मैपिंग में उस इकाई के लिए कस्टम टाइप को ओवरराइड कर सकता हूं? –

+0

@GerardoGrignoli: हाँ आप कर सकते हैं। सम्मेलन केवल डिफ़ॉल्ट सेट करते हैं। यदि आप ansi-string कन्वेंशन का उपयोग करते हैं, और फिर i.e. 'कस्टम टाइप टाइप करें 'के लिए एक विशिष्ट कॉलम मैपिंग करें, तो यह वैसे ही काम करेगा जैसा आप उम्मीद करेंगे। – quetzalcoatl

0

हमने "कस्टम टाइप (" AnsiString ")" विकल्प का उपयोग करके पाया है कि यह nvarchar का उपयोग करने से रोकता है, हालांकि, यह वर्चर (30) के रूप में निर्दिष्ट कॉलम के लिए 8000 की फ़ील्ड लंबाई सेट करता है। 8000 वर्चर 4000 nvarchar से बहुत तेज है, लेकिन यह अभी भी एसक्यूएल सर्वर ओवरहेड के साथ बड़ी समस्याएं पैदा कर रहा है।

+1

तो आपने कोशिश की है: मानचित्र (x => x.Context) .CustomSqlType ("वर्कर (30)"); – Ted

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