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을 사용하면 테이블이 성공적으로 생성됩니다.
이것은 나를 괴롭히는 결과이며, 아마도 빠른 수정 일 것이라고 확신합니다. 어떤 아이디어?
감사합니다.
앤서니
돌아와서 알려 주셔서 감사합니다. 문제가 해결되었습니다. 따라서 우리는 이것이 오늘날 누구에게도 괴롭히지 않는다는 것을 압니다. – Marcel