Problema com o Fluent Nibernate Automapping e GUIDS / UniqueIdentifiers como campos -chave primários
-
20-09-2019 - |
Pergunta
Estou tentando usar a funcionalidade Fluent-Nibernate Automapping (na versão mais recente do software) e estou enfrentando problemas usando o GUIDS como os campos principais. Se eu usar campos inteiros para as chaves primárias, as tabelas são geradas com sucesso e toda a funcionalidade Nibernate parece funcionar bem. Para sua informação, estou usando o Nibernate para gerar minhas tabelas de banco de dados.
Aqui estão algumas aulas com IDs inteiros.
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);
}
}
}
Aqui estão as mesmas classes com Guids.
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);
}
}
}
Aqui está minha configuração.
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();
Para contornar o problema, tentei gerar convenções (veja abaixo) para 1) nomeando o campo de identificação (embora eu pensasse que deveria ter sido desnecessário) e por 2) gerando o ID (o que eu pensei que seria automático). Não tenho certeza do que está acontecendo ou por que isso não está funcionando.
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();
}
}
Além disso, se eu desligar o automaptação e usar o mapa configurado fluentemente, as tabelas serão geradas com sucesso.
Isso está me deixando louco, e tenho certeza de que provavelmente é uma solução rápida. Alguma ideia?
Obrigada!
Anthony
Solução
Aparentemente, houve um problema no Fluent Nibernate versão 1.0RC e versão 1.0. No entanto, se você baixar a versão mais recente do tronco SVN, tudo funciona perfeitamente. Parece que o problema era simplesmente um bug no código que agora foi corrigido.
Além disso, devo observar que James Gregory, Paul Batum e talvez outros estão trabalhando ativamente em Nibernados fluentes. O produto está evoluindo bastante dramaticamente e houve mudanças significativas no código nos últimos dois meses.