【问题标题】:FluentNHibernate mapping without foreign key没有外键的 FluentNHibernate 映射
【发布时间】:2013-05-22 21:53:12
【问题描述】:

我有这 2 节课

public class Product {
    public virtual Guid Id {get; set;}
    public virtual string Name {get; set;}
    public virtual Description Description {get; set;}
}

public class Description {
    public virtual Guid Id {get; set;}
    public virtual string Suggestion {get; set;}
    public virtual string Composition {get; set;}
}

我尝试用这个 Mapper 类来映射这个类:

public class ProductMap : ClassMap<Product>
{
    public ProductMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        References(x => x.Description).ForeignKey("Id");
    }
}

描述与具有相同 Id 的产品相关,因此例如 Id = 1 的产品将在 Id = 1 的表中具有描述。 现在我尝试用这个从表中读取数据:

using (var session = factory.OpenSession())
{
    var testProduct = session.Query<Product>().Where(p => p.Id == 2).Single();
    lblValue.Text = testProduct.Description.Composition;
}

但我得到错误异常

InnerException: System.Data.SqlClient.SqlException
       Message=Invalid column name 'Description_id'.

我知道我在映射器构造函数中放了一些错误。你们能帮我如何正确映射它。我不想将字段 Description_id 放在表产品中。谢谢

【问题讨论】:

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


    【解决方案1】:

    把你的 ProductMap 改成这样:

    public class ProductMap : ClassMap<Product>
    {
      public ProductMap()
      {
        Id(x => x.Id);
        Map(x => x.Name);
        References(x => x.Description).Columns("Id");
      }
    }
    

    这告诉 nHibernate 使用 Product 实体的“Id”列将 Products 与 Description 连接到 DescriptionMap 中定义为 Id 的列(也需要设置为“Id”)。如果您还没有它,我已经创建了一个您还需要的 DescriptionMap 类:

    public class DescriptionMap : ClassMap<Description>
    {
      public DescriptionMap ()
      {
        Id(x => x.Id);
        Map(x => x.Suggestion);
        Map(x => x.Composition);
      }
    }
    

    【讨论】:

      【解决方案2】:

      CSL 提到的应该可以,但我要补充的是,列名实际上是 References 方法的第二个参数,所以你可以简单地这样做。

      public class ProductMap : ClassMap<Product>
      {
        public ProductMap()
        {
          Id(x => x.Id);
          Map(x => x.Name);
          References(x => x.Description, "Id");
        }
      }
      

      【讨论】:

      • 谢谢,它适用于阅读。但现在插入时出现问题。
      • 要解决插入问题,请将两个类上的 Id 映射更改为 Id(x=>x.Id).GeneratedBy.Assigned();这告诉 nHibernate 应用程序将指定 Id,并且不会由 DB 中的 Identity 列自动生成。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      相关资源
      最近更新 更多