Problema con Fluent NHibernate Automapping e GUID / UniqueIdentifiers come Campi chiave principali
-
20-09-2019 - |
Domanda
Sto tentando di utilizzare la funzionalità automapping Fluent-NHibernate (nella versione più recente del software) e sono in esecuzione in problemi utilizzando GUID come i campi chiave primaria. Se uso campi di numeri interi per le chiavi primarie, le tabelle vengono generate con successo e tutte le funzionalità NHibernate sembra funzionare bene. Cordiali saluti, Sto usando NHibernate per generare i miei tabelle del database.
Qui ci sono un paio di classi con ID interi.
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);
}
}
}
Qui ci sono le stesse classi con 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);
}
}
}
Qui è la mia configurazione.
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();
Per risolvere il problema, ho tentato di generare convenzioni (vedi sotto) per 1) denominazione del campo ID (anche se ho pensato che avrebbe dovuto essere inutile) e per 2) che generano l'Es (che ho pensato sarebbe stata automatica ). Io sono sicuro che cosa sta accadendo o perché questo non sta funzionando.
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();
}
}
Inoltre, se mi rivolgo automapping fuori e utilizzare fluentemente configurato mappa le tabelle vengono generate con successo.
Questo mi sta facendo noci, e sono sicuro che è probabilmente una soluzione rapida. Qualche idea?
Grazie!
Anthony
Soluzione
A quanto pare, si è verificato un problema nella versione Fluent NHibernate 1.0RC e la versione 1.0. Tuttavia, se si scarica la versione più recente dal tronco SVN, ogni cosa funziona perfettamente. Sembra che il problema era semplicemente un bug nel codice, che ora è stato corretto.
Inoltre, Vorrei sottolineare che James Gregory, Paolo Batum, e forse altri, stanno lavorando attivamente su Fluent NHibernate. Il prodotto è in continua evoluzione abbastanza drasticamente e ci sono stati cambiamenti significativi al codice negli ultimi due mesi.