1

Fluent-NHibernate 자동 매핑 기능을 사용하려고합니다 (소프트웨어의 최신 버전에서) Guids를 기본 키 필드로 사용하여 문제가 발생했습니다. 기본 키에 정수 필드를 사용하면 테이블이 성공적으로 생성되고 모든 Nhibernate 기능이 제대로 작동하는 것 같습니다. 참고로, NHibernate를 사용하여 데이터베이스 테이블을 생성하고 있습니다.Fluent Nhibernate 자동 매핑 및 GUID/고유 식별자를 기본 키 필드로 사용

다음은 정수 ID를 사용하는 몇 가지 클래스입니다.

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 
using System.Reflection; 

namespace Sample.Data.Entities 
{ 
    public class Employee 
    { 
     public virtual int Id { get; private set; } 
     public virtual string FirstName { get; set; } 
     public virtual string LastName { get; set; } 
     public virtual Store Store { get; set; } 
    } 

    public class Product 
    { 
     public virtual int Id { get; private set; } 
     public virtual string Name { get; set; } 
     public virtual double Price { get; set; } 
     public virtual IList<Store> StoresStockedIn { get; private set; } 

     public Product() 
     { 
      StoresStockedIn = new List<Store>(); 
     } 
    } 

    public class Store 
    { 
     public virtual int Id { get; private set; } 
     public virtual string Name { get; set; } 
     public virtual IList<Product> Products { get; set; } 
     public virtual IList<Employee> Staff { get; set; } 

     public Store() 
     { 
      Products = new List<Product>(); 
      Staff = new List<Employee>(); 
     } 

     public virtual void AddProduct(Product product) 
     { 
      product.StoresStockedIn.Add(this); 
      Products.Add(product); 
     } 

     public virtual void AddEmployee(Employee employee) 
     { 
      employee.Store = this; 
      Staff.Add(employee); 
     } 
    } 
} 

다음은 GUID가있는 동일한 클래스입니다.

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 
using System.Reflection; 

namespace Sample.Data.Entities 
{ 
    public class Employee 
    { 
     public virtual Guid Id { get; private set; } 
     public virtual string FirstName { get; set; } 
     public virtual string LastName { get; set; } 
     public virtual Store Store { get; set; } 
    } 

    public class Product 
    { 
     public virtual Guid Id { get; private set; } 
     public virtual string Name { get; set; } 
     public virtual double Price { get; set; } 
     public virtual IList<Store> StoresStockedIn { get; private set; } 

     public Product() 
     { 
      StoresStockedIn = new List<Store>(); 
     } 
    } 

    public class Store 
    { 
     public virtual Guid Id { get; private set; } 
     public virtual string Name { get; set; } 
     public virtual IList<Product> Products { get; set; } 
     public virtual IList<Employee> Staff { get; set; } 

     public Store() 
     { 
      Products = new List<Product>(); 
      Staff = new List<Employee>(); 
     } 

     public virtual void AddProduct(Product product) 
     { 
      product.StoresStockedIn.Add(this); 
      Products.Add(product); 
     } 

     public virtual void AddEmployee(Employee employee) 
     { 
      employee.Store = this; 
      Staff.Add(employee); 
     } 
    } 
} 

다음은 나의 구성입니다.

return Fluently.Configure() 
     .Database(MsSqlConfiguration.MsSql2008 
     .ConnectionString(c => c.FromConnectionStringWithKey("AAAConnectionString")) 
     .UseReflectionOptimizer()    
     .AdoNetBatchSize(25) 
     .DefaultSchema("dbo") 
     .Cache(c => c 
     .UseQueryCache() 
     .ProviderClass<HashtableCacheProvider>()) 
     .ShowSql()) 
     .Mappings(m=>m.AutoMappings 
     .Add(AutoMap.AssemblyOf<Sample.Data.Entities.Product>()     
     .Where(type => type.Namespace == "Sample.Data.Entities.Product") 
     .Conventions.AddFromAssemblyOf<Sample.Data.Fluent.Conventions.PrimaryKeyNameConvention>() 
     )) 
     .ExposeConfiguration(BuildSchema)    
     .BuildSessionFactory(); 

이 문제를 해결하기 위해, I는 I 생각 이드 (생성 1 규칙 (아래 참조)) I가 불필요 했어야 생각) 및 2 (비록 ID 필드 명명)를 생성하려고 자동이었을 것이다). 무슨 일이 일어나고 있는지, 왜 작동하지 않는지 나는 확신 할 수 없다.

public class PrimaryKeyNameConvention : IIdConvention 
{ 
    public bool Accept(IIdentityInstance id) 
    { 
     return true; 
    } 
    public void Apply(IIdentityInstance id) 
    { 
     id.Column("Id");     
    } 
} 

public class PrimaryKeyGeneratorConvention : IIdConvention 
{ 
    public bool Accept(IIdentityInstance id) 
    { 
     return true; 
    } 
    public void Apply(IIdentityInstance id) 
    { 
     id.GeneratedBy.GuidComb(); 
    } 
} 

또한 자동 매핑을 해제하고 Fluently configured map을 사용하면 테이블이 성공적으로 생성됩니다.

이것은 나를 괴롭히는 결과이며, 아마도 빠른 수정 일 것이라고 확신합니다. 어떤 아이디어?

감사합니다.

앤서니

답변

4

분명히, 유창함 NHibernate에 버전 1.0RC 및 버전 1.0에 문제가 있었다. 그러나 SVN 트렁크에서 최신 버전을 다운로드하면 모든 것이 완벽하게 작동합니다. 이 문제는 단순히 코드의 버그로 수정 된 것으로 보입니다.

또한 James Gregory, Paul Batum 및 다른 사람들도 Fluent NHibernate에서 활발하게 작업하고 있습니다. 이 제품은 상당히 발전했으며 지난 몇 달 동안 코드가 크게 변경되었습니다.

+2

돌아와서 알려 주셔서 감사합니다. 문제가 해결되었습니다. 따라서 우리는 이것이 오늘날 누구에게도 괴롭히지 않는다는 것을 압니다. – Marcel