свободно говорит, не может разрешить свойство: <property> - PullRequest
0 голосов
/ 22 марта 2012

У меня есть отношения один-к-одному в моем БД, и у меня, кажется, есть проблемы с моим беглым отображением 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/

Неполадки сопоставления с NHibernate / Fluent: внешний ключ не обновляется

IndexOutOfRangeException Глубоко в недрах 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 не каскадно связан с записью TableB.


Еще прочитал.
Нашел этот пост: Свободное отношение NHibernate один к одному?

Внесены некоторые дополнительные изменения:

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

Новая ошибка: "попытка присвоить идентификатор из нулевого свойства" один к одному ": TableA"

1 Ответ

0 голосов
/ 19 апреля 2012

Несмотря на то, что это отношение один-к-одному и должно быть одно-к-одному, я закончил тем, что изменил определение своей базы данных, чтобы сделать это отношение много-к-одному, и я отобразил его как многозначное. к одному. Теперь это работает. Я не рад этому, хотя, я думаю, должен быть способ успешно нанести один на один.

Я тратил слишком много времени, пытаясь заставить работать однозначное сопоставление, и ради своей временной шкалы мне просто нужно было двигаться дальше.

...