流利的nhibernate,无法解析属性:<property> </property>

时间:2012-03-22 17:18:18

标签: fluent-nhibernate fluent-nhibernate-mapping

我在我的数据库中有一对一的关系,我似乎遇到了这种关系的流畅的nhibernate映射问题。

当我尝试插入新的TableA实体时,我收到以下错误:“无法解析属性:TableA”。在存储库中的这一行抛出错误:int id =(int)_session.Save(item);

存储库代码:

public T Save(T item)
{
    try
    {
        _session.BeginTransaction();
        int id = (int)_session.Save(item);
        _session.Transaction.Commit();
        return _session.Get<T>(id);
    }
    catch (Exception)
    {
        _session.Transaction.Rollback();
        throw;
    }
}

表格定义:

表A

Id (int, pk, identity) 
Field1 (nvarchar) 
Field2 (date) 
...

表B

TableAId (int, pk) <-- no fk constraint on these tables
Field1 (nvarchar)
Field2 (nvarchar)
Field3 (bit)

类:

public class TableA
{
    public virtual int Id {get;set;}
    public virtual string Field1 {get;set;}
    public virtual DateTime Field2 {get;set;}
    public virtual TableB TableB {get;set;}
}

public class TableB
{
    public virtual int TableAId {get;set;}
    public virtual string Field1 {get;set;}
    public virtual string Field2 {get;set;}
}

映射:

public class TableAMap : ClassMap<TableA>
{
    public TableAMap(){
        Id(x => x.Id);
        Map(x => x.Field1);
        Map(x => x.Field2);
        HasOne(x => x.TableB)
         .Cascade.SaveUpdate()
         .Fetch.Join();
    }
}

public class TableBMap : ClassMap<TableB>
{
    public TableBMap()
    {
        Id(x => x.Id, "TableAId").GeneratedBy.Foreign("TableA");
        Map(x => x.Field1);
        Map(x => x.Field2);
        Map(x => x.Field3);
    }
}

我用这些作为参考: http://avinashsing.sunkur.com/2011/09/29/how-to-do-a-one-to-one-mapping-in-fluent-nhibernate/

One-to-one Mapping issue with NHibernate/Fluent: Foreign Key not updateing

IndexOutOfRangeException Deep in the bowels of NHibernate

我已经看了这么久了,现在我担心我会遗漏一些简单的(和愚蠢的)。


更新 试过这个:

public class TableA
{
    public virtual int Id {get;set;}
    public virtual string Field1 {get;set;}
    public virtual DateTime Field2 {get;set;}
    public virtual TableB TableB {get;set;}
    public virtual int TableBId
    {
         get{return TableB.Id;}
         set{}
    }
}

public class TableAMap : ClassMap<TableA>
{
    public TableAMap()
    {
        Id(x => x.Id);
        Map(x => x.Field1);
        Map(x => x.Field2);
        HasOne<TableB>(x => x.TableB)
         .Cascade.SaveUpdate()
         .Fetch.Join()
         .ForeignKey("TableBId");
    }
}

public class TableBMap : ClassMap<TableB>
{
    public TableBMap()
    {
        Id(x => x.Id, "TableAId");
        Map(x => x.Field1);
        Map(x => x.Field2);
        Map(x => x.Field3);
    }
}

这次我没有得到“无法解析属性:TableA”错误,但我收到了不同的错误。似乎TableA记录的Id没有级联到TableB记录。


做了一些阅读 找到这篇文章:fluent NHibernate one-to-one relationship?

做了一些更改:

public class TableAMap : ClassMap<TableA>
{
    public TableAMap()
    {
        Id(x => x.Id);
        Map(x => x.Field1);
        Map(x => x.Field2);
        HasOne<TableB>(x => x.TableB)
         .Cascade.All()
         .Constrained()
         .Fetch.Join()
         .ForeignKey("TableBId");
    }
}

public class TableBMap : ClassMap<TableB>
{
    public TableBMap()
    {
        Id(x => x.Id, "TableAId").UnsavedValue(0).GeneratedBy.Foreign("TableA");
        Map(x => x.Field1);
        Map(x => x.Field2);
        Map(x => x.Field3);
        HasOne<TableA>(x => x.TableA);
    }
}

新错误: “尝试从null一对一属性中分配id:TableA”

1 个答案:

答案 0 :(得分:0)

即使这种关系是一对一的,也应该是一对一的,我最终修改了我的数据库定义,以使这种关系成为多对一,并将其​​映射为多个 - 一对一。现在它有效。我对此并不满意,我认为应该有一种成功映射一对一的方法。

我浪费了太多时间试图让一对一的映射工作,为了我的时间表,我只需要继续前进。