1

Я пытаюсь использовать функциональность автомата для Fluent-NHibernate (в последней версии программного обеспечения), и у меня возникают проблемы с использованием Guids в качестве полей основного ключа. Если я использую целочисленные поля для первичных ключей, таблицы сгенерированы успешно, и все функции Nhibernate работают нормально. FYI, я использую NHibernate для генерации моих таблиц базы данных.Проблема с Свободным автопилотом Nhibernate и гидами/UniqueIdentifiers в качестве полей первичного ключа

Вот пара классов с целыми идентификаторами.

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(); 

Чтобы обойти эту проблему, я попытался сформировать конвенции (см ниже) для 1) Именование поле Id (хотя я думал, что это должно было быть ненужным) и 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(); 
    } 
} 

Кроме того, если я включаю автоматическое отключение и использование карты с плавной настройкой, таблицы сгенерированы успешно.

Это сводит меня с ума, и я уверен, что это, вероятно, быстрое решение. Есть идеи?

Спасибо!

Энтони

ответ

4

Видимо, была проблема в версии 1.0RC и версии 1.0 Fluent NHibernate. Однако, если вы загружаете последнюю версию из ствола SVN, все прекрасно работает. Похоже, что проблема была просто ошибкой в ​​коде, который теперь исправлен.

Кроме того, я должен отметить, что Джеймс Грегори, Пол Батум и, возможно, другие, активно работают над Fluent NHibernate. Продукт развивается довольно резко, и за последние пару месяцев произошли значительные изменения в коде.

+2

Спасибо, что вернулись и сообщили, что эта проблема ушла. Таким образом, мы знаем, что сегодня это никого не раздражает. – Marcel

Смежные вопросы