c# - IManyToManyCollectionInstance 约定创建额外的表

标签 c# postgresql nhibernate fluent-nhibernate nhibernate-mapping

我有一个基于 Fluent NHibernate 约定的映射,在我的 StockPurchase 实体和我的 StockSale 实体之间具有多对多关系。

我创建了以下约定:

public class ManyToManyLinkedTableConvention : IHasManyToManyConvention
{
    public void Apply(FluentNHibernate.Conventions.Instances.IManyToManyCollectionInstance instance)
    {
        var naming = new NamingStrategy();
        if (StringComparer.InvariantCultureIgnoreCase.Compare(instance.EntityType.Name, instance.OtherSide.EntityType.Name) > 0)
        {
            instance.Table(naming.Quote(
                string.Format(
                    "{0}To{1}",
                    Inflector.Inflector.Pluralize(instance.EntityType.Name),
                    Inflector.Inflector.Pluralize(instance.ChildType.Name))));
            instance.Not.Inverse();
        }
        else
        {
            instance.Inverse();
        }
    }
}

当我使用 hbm2ddl 函数时,它会完全按照我的需要构建表:

CREATE TABLE "StockSalesToStockPurchases"
(
  stocksale_id uuid NOT NULL,
  stockpurchase_id uuid NOT NULL,
  CONSTRAINT fkee886e07285f29f1 FOREIGN KEY (stockpurchase_id)
      REFERENCES "StockPurchases" (stockpurchaseid) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fkee886e073b8be3d9 FOREIGN KEY (stocksale_id)
      REFERENCES "StockSales" (stocksaleid) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
);

...奇怪的是,它还创建了第二个表:

CREATE TABLE stockpurchasestostocksales
(
  stockpurchase_id uuid NOT NULL,
  stocksale_id uuid NOT NULL,
  CONSTRAINT fk396e0343285f29f1 FOREIGN KEY (stockpurchase_id)
      REFERENCES "StockPurchases" (stockpurchaseid) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fk396e03433b8be3d9 FOREIGN KEY (stocksale_id)
      REFERENCES "StockSales" (stocksaleid) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
);

它为什么这样做,我该如何阻止它?

最佳答案

好的,我知道怎么做了。如果有更好的方法,请告诉我。

public class ManyToManyLinkedTableConvention : IHasManyToManyConvention
{
    public void Apply(IManyToManyCollectionInstance instance)
    {
        var naming = new NamingStrategy();
        string firstName;
        string secondName;

        if (StringComparer.InvariantCultureIgnoreCase.Compare(instance.EntityType.Name, instance.OtherSide.EntityType.Name) >
            0)
        {
            firstName = instance.EntityType.Name;
            secondName = instance.OtherSide.EntityType.Name;
        }
        else
        {
            secondName = instance.EntityType.Name;
            firstName = instance.OtherSide.EntityType.Name;
            instance.Not.Inverse();
        }

        instance.Table(naming.Quote(
            string.Format(
                "{0}To{1}",
                Inflector.Inflector.Pluralize(firstName),
                Inflector.Inflector.Pluralize(secondName))));
    }
}

关于c# - IManyToManyCollectionInstance 约定创建额外的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15982782/

相关文章:

c# - 绕过聚合根

c# - 安装的默认数据

c# - StackExchange.Redis 是否在内存缓存中使用本地?

c# - Int32.ToString() 太慢

c# - 如何获取当前工作目录路径c#?

sql - 分页使用搜索方法(键集)

postgresql - 每个用户都可以使用 pg_restore 恢复转储吗?

c# - 在本地主机上使用 Firefox 运行 WatiN

sql - 如何正确转义 SQL "LIKE"运算符的用户输入? (Postgres)

c# - 线程,流畅的 nhibernate 和保存数据陷入僵局