I am attempting to use the Fluent-NHibernate automapping functionality
(in the latest version of the software) and am running into problems
using Guids as the Primary Key fields. If I use integer fields for the
primary keys, the tables are generated successfully and all Nhibernate
functionality seems to work fine. FYI, I am using NHibernate to
generate my database tables.

Here are a couple of classes with integer IDs.


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

Here are the same classes with 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);
            }
        }
    }

Here is my configuration.


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


To work around the issue, I attempted to generate conventions (see
below) for 1) naming the Id field (although I thought it should have
been unnecessary) and for 2) generating the Id (which I thought would
have been automatic). I am unsure what is happening or why this is not
working.


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

Also, if I turn automapping off and use Fluently configured map the
tables are generated successfully.

This is driving me nuts, and I am sure it is probably a quick fix. Any
ideas?

Thank you!

Anthony

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Fluent NHibernate" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/fluent-nhibernate?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to