2016-02-12 87 views
1

所以我一直在为此挣扎了大约半天吧.. 我来eclipselink和java,对于一个项目我正在做一些代码与NHibernate和C#。 关于通过nhibernate上的代码映射的不幸的文档是我猜想的缺乏。我无法找到我得到了错误的任何资源..NHibernate映射的代码,没有persister为:

出于测试目的,我用Northwind数据库的工作,所以我创建了一个一流的客户

public class Customer{ 
    public virtual string CustomerID { get; set; } 
    public virtual string CompanyName { get; set; } 
    public virtual string ContactName { get; set; } 
    public virtual string ContactTitle { get; set; } 
    public virtual string Address { get; set; } 
    public virtual string City { get; set; } 
    public virtual string Region { get; set; } 
    public virtual string PostalCode { get; set; } 
    public virtual string Country { get; set; } 
    public virtual string Phone { get; set; } 
    public virtual string Fax { get; set; } 
} 

另外一个映射类:

public class CustomerMap: ClassMapping<Customer> 
{ 
    public CustomerMap() { 
     Schema("dbo"); 
     Lazy(true); 
     Id(x => x.CustomerID, map => map.Generator(Generators.Assigned)); 
     Property(x => x.CompanyName, map => map.NotNullable(true)); 
     Property(x => x.ContactName); 
     Property(x => x.ContactTitle); 
     Property(x => x.Address); 
     Property(x => x.City); 
     Property(x => x.Region); 
     Property(x => x.PostalCode); 
     Property(x => x.Country); 
     Property(x => x.Phone); 
     Property(x => x.Fax); 
    } 
} 

但后来我得到的不留存错误

ModelMapper mm = new ModelMapper(); 
mm.AddMapping<CustomerMap>(); 
HbmMapping hbmm = mm.CompileMappingForAllExplicitlyAddedEntities(); 
XmlSerializer xml = new XmlSerializer(hbmm.GetType()); 
xml.Serialize(Console.Out, hbmm); 

这是TH的XML上述E码生成

<?xml version="1.0" encoding="Windows-1252"?> 
<hibernate-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" namespace="NHibernate.Classes.Domain" assembly="NHibernate, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" xmlns="urn:nhibernate-mapping-2.2"> 
     <class name="Customer" schema="dbo"> 
     <id name="CustomerID" type="String"> 
      <generator class="assigned" /> 
     </id> 
     <property name="CompanyName" not-null="true" /> 
     <property name="ContactName" /> 
     <property name="ContactTitle" /> 
     <property name="Address" /> 
     <property name="City" /> 
     <property name="Region" /> 
     <property name="PostalCode" /> 
     <property name="Country" /> 
     <property name="Phone" /> 
     <property name="Fax" /> 
     </class> 
    </hibernate-mapping> 

由于我与地图通过代码的东西的工作,我不想创建这个XML自己,所以我不知道什么我可能是做错了。我搜遍了谷歌。

回答

0

这里是我的电话,其中_mapper是ModelMapper映射实体

_mapper.AddMappings(MappingAssembly.GetExportedTypes()); 
      Configure.AddDeserializedMapping(_mapper.CompileMappingForAllExplicitlyAddedEntities(), "MyWholeDomain"); 

。我还明确地添加了一个配置设置来告诉应用程序我的映射在哪里。所以,我加载该程序集,然后调用GetExportedTypes()

这里是我的整个NhibernateInitializer类

public abstract class NHibernateInitializer : IDomainMapper 
{ 
    protected Configuration Configure; 
    private ISessionFactory _sessionFactory; 
    private readonly ModelMapper _mapper = new ModelMapper(); 
    private Assembly _mappingAssembly; 
    private readonly String _mappingAssemblyName; 
    private readonly String _connectionString; 

    protected NHibernateInitializer(String connectionString, String mappingAssemblyName) 
    { 
     if (String.IsNullOrWhiteSpace(connectionString)) 
      throw new ArgumentNullException("connectionString", "connectionString is empty."); 

     if (String.IsNullOrWhiteSpace(mappingAssemblyName)) 
      throw new ArgumentNullException("mappingAssemblyName", "mappingAssemblyName is empty."); 

     _mappingAssemblyName = mappingAssemblyName; 
     _connectionString = connectionString; 
    } 

    public ISessionFactory SessionFactory 
    { 
     get 
     { 
      return _sessionFactory ?? (_sessionFactory = Configure.BuildSessionFactory()); 
     } 
    } 

    private Assembly MappingAssembly 
    { 
     get 
     { 
      return _mappingAssembly ?? (_mappingAssembly = Assembly.Load(_mappingAssemblyName)); 
     } 
    } 

    public void Initialize() 
    { 
     Configure = new Configuration(); 
     Configure.EventListeners.PreInsertEventListeners = new IPreInsertEventListener[] { new EventListener() }; 
     Configure.EventListeners.PreUpdateEventListeners = new IPreUpdateEventListener[] { new EventListener() }; 
     Configure.SessionFactoryName(System.Configuration.ConfigurationManager.AppSettings["SessionFactoryName"]); 
     Configure.DataBaseIntegration(db => 
             { 
              db.Dialect<MsSql2008Dialect>(); 
              db.Driver<SqlClientDriver>(); 
              db.KeywordsAutoImport = Hbm2DDLKeyWords.AutoQuote; 
              db.IsolationLevel = IsolationLevel.ReadCommitted; 
              db.ConnectionString = _connectionString; 
              db.BatchSize = 20; 
              db.Timeout = 10; 
              db.HqlToSqlSubstitutions = "true 1, false 0, yes 'Y', no 'N'"; 
             }); 
     Configure.SessionFactory().GenerateStatistics(); 

     Map(); 
    } 

    private void Map() 
    { 
     _mapper.AddMappings(MappingAssembly.GetExportedTypes()); 
     Configure.AddDeserializedMapping(_mapper.CompileMappingForAllExplicitlyAddedEntities(), "MyWholeDomain"); 
    } 

    public HbmMapping HbmMapping 
    { 
     get { return _mapper.CompileMappingFor(MappingAssembly.GetExportedTypes()); } 
    } 

    public IList<HbmMapping> HbmMappings 
    { 
     get { return _mapper.CompileMappingForEach(MappingAssembly.GetExportedTypes()).ToList(); } 
    } 

    /// <summary> 
    /// Gets the domain entities. 
    /// </summary> 
    /// <returns></returns> 
    /// <remarks>by default anything that derives from EntityBase and isn't abstract or generic</remarks> 
    protected virtual IEnumerable<System.Type> GetDomainEntities() 
    { 
     List<System.Type> domainEntities = (from t in MappingAssembly.GetExportedTypes() 
              where typeof(EntityBase<Guid>).IsAssignableFrom(t) 
              && (!t.IsGenericType || !t.IsAbstract) 
              select t 
              ).ToList(); 

     return domainEntities; 
    } 
} 
相关问题