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

发布于 2024-09-12 06:05:21 字数 1665 浏览 4 评论 0原文

您好,使用流畅的 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'。

如何让 fluidnibernate 使用 MapMarkerIconId 而不是 MapMarkerIcon_id?

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

做个ˇ局外人 2024-09-19 06:05:21

以上链接均无效。这是解决方案,其中包含当前 Fluent NHibernate 和 Fluent NHibernate 的链接。自动映射文档。

问题(一个简单的例子):

假设你有一个简单的例子(来自 Fluent 的 wiki),它有一个实体,它是列表中的值对象:

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

和 Shelfid 的外键 -> ; 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 列映射到 Product 中的 Shelf 属性。


更多信息

自动映射 Wiki

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")

查看有关 Fluent NHibernate 自动映射约定的更多信息

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文