Why does Fluent NHibernate AutoMappings add an underscore to Id (e.g. Entity_id)?

扶醉桌前 提交于 2020-01-30 06:41:44

问题


Hi using fluent nibernate automappings

to map this

    public virtual int Id { get; set; }
    /*...snip..*/
    public virtual MapMarkerIcon MapMarkerIcon { get; set; }
}

to this

CREATE TABLE [Attraction](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [MapMarkerIconId] [int] NULL
)

with this:

var cfg = Fluently.Configure()


            .Database(MsSqlConfiguration.MsSql2005.ConnectionString(connectionString)
                .DefaultSchema("xxx"))

            .Mappings(m =>
                          {
                              m.AutoMappings
                                  .Add(
                                  AutoMap.AssemblyOf<Partner>().Where(
                                      n => n.Namespace == "xxx.Core.Domain")

                                  );

                              m.FluentMappings.Conventions.Add(PrimaryKey.Name.Is(x => "Id"),
                                                               DefaultLazy.Always(),
                                                               ForeignKey.EndsWith("Id")
                                  );
                          }


            )

            .ExposeConfiguration(c => c.SetProperty(Environment.ReleaseConnections, "on_close"))
            .ExposeConfiguration(c => c.SetProperty(Environment.ProxyFactoryFactoryClass, typeof(ProxyFactoryFactory).AssemblyQualifiedName))
            .BuildConfiguration();

Why do I get

Server Error in '/XXX.Web' Application. Invalid column name 'MapMarkerIcon_id'.

How can I make fluentnibernate use MapMarkerIconId instead of MapMarkerIcon_id?


回答1:


You need an Id convention.

See http://wiki.fluentnhibernate.org/Available_conventions and http://wiki.fluentnhibernate.org/Convention_shortcut




回答2:


None of the above links work. Here's the solution with links to current Fluent NHibernate & automapping documentation.

The issue (a simple example):

Say you have the simple example (from fluent's wiki) with an Entity and it's Value Objects in a List:

public class Product
{
  public virtual int Id { get; set; }
  //..
  public virtual Shelf { get; set; }
}

public class Shelf
{
  public virtual int Id { get;  set; }
  public virtual IList<Product> Products { get; set; }

  public Shelf()
  {
    Products = new List<Product>();
  }
}

With tables which have e.g.

Shelf 
id int identity

Product 
id int identity 
shelfid int

And a foreign key for shelfid -> Shelf.Id


You would get the error: invalid column name ... shelf_id


Solution:

Add a convention, it can be system wide, or more restricted.

ForeignKey.EndsWith("Id")

Code example:

var cfg = new StoreConfiguration();
var sessionFactory = Fluently.Configure()
  .Database(/* database config */)
  .Mappings(m =>
    m.AutoMappings.Add(
      AutoMap.AssemblyOf<Product>(cfg)
          .Conventions.Setup(c =>
              {
                  c.Add(ForeignKey.EndsWith("Id"));
              }
    )
  .BuildSessionFactory();

Now it will automap the ShelfId column to the Shelf property in Product.


More info

Wiki for Automapping

Table.Is(x => x.EntityType.Name + "Table")
PrimaryKey.Name.Is(x => "ID")
AutoImport.Never()
DefaultAccess.Field()
DefaultCascade.All()
DefaultLazy.Always()
DynamicInsert.AlwaysTrue()
DynamicUpdate.AlwaysTrue()
OptimisticLock.Is(x => x.Dirty())
Cache.Is(x => x.AsReadOnly())
ForeignKey.EndsWith("ID")

See more about Fluent NHibernate automapping conventions



来源:https://stackoverflow.com/questions/3395340/why-does-fluent-nhibernate-automappings-add-an-underscore-to-id-e-g-entity-id

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!