2013-05-22 4 views
0

у меня есть этот 2 классFluentNHibernate отображение без внешнего ключа

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 = 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 в таблицу Product. Благодаря

ответ

1

Изменение ProductMap быть таким:

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

Это говорит NHibernate присоединиться Продукцию Описание, используя столбец «Id» из сущности продукта в колонке определяется как Id в DescriptionMap (который также должен быть установлен в «Id»). Incase вы уже не имеете его, я создал класс DescriptionMap, который вам также потребуется:

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

Что CSL упоминалось должно работать, но я хотел бы добавить, что имя столбца является фактически второй параметр метода Ссылки , поэтому вы можете просто сделать это.

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

спасибо, он работает для чтения. но теперь у меня проблема при вставке. –

+0

Чтобы исправить проблему с вставкой, измените сопоставления идентификаторов на обоих классах как Id (x => x.Id) .GeneratedBy.Assigned(); Это говорит nHibernate, что приложение будет указывать Id, и оно не будет автоматически генерироваться столбцом Identity в БД. – CSL

Смежные вопросы