为什么Fluent NHibernate AutoMappings会向Id添加下划线(例如Entity_id)?

时间:2010-08-03 09:48:52

标签: fluent-nhibernate

您正在使用流畅的nibernate自动化

映射此

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

到这个

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

用这个:

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

为什么我

  

'/XXX.Web'中的服务器错误   应用。列名无效   'MapMarkerIcon_id'。

如何使用MapMarkerIconId而不是MapMarkerIcon_id来使用fluentnibernate?

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

以上链接都不起作用。这是解决方案,链接到当前的Fluent NHibernate&amp;自动化文档。

问题(一个简单示例):

假设你有一个简单的例子(来自流利的维基)和一个实体,它是一个列表中的值对象:

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

使用例如表格

Shelf 
id int identity

Product 
id int identity 
shelfid int

用于货架的外键 - &gt; Shelf.Id


你会得到错误: 无效的列名... shelf_id


解决方案:

添加约定,可以是系统范围的,也可以是更受限制的。

ForeignKey.EndsWith("Id")

代码示例:

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

现在,它会将ShelfId列自动化为Shelf中的Product属性。


更多信息

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