Ответ 1
Чтобы получить двунаправленную связь с не-нулевым столбцом внешнего ключа в таблице "Сведения", вы можете добавить предлагаемое свойство "Владелец", сопоставление "Ссылки" (...). CanNotBeNull() в классе "DetailsMap" и сделать конец сводной информации обратный.
Чтобы избежать двух разных столбцов внешнего ключа для двух направлений ассоциации, вы можете указать имена столбцов вручную или назвать свойства таким образом, чтобы они указывали одинаковое имя столбца для обоих направлений. В этом случае вы предлагаете переименовать свойство Details.Owner в Details.Summary.
Я сделал идентификатор Summary, сгенерированный с помощью инкремента, чтобы избежать проблем при вставке в таблицу, так как Summary currenty не имеет столбцов, кроме id.
Домен:
public class Detail
{
public int id { get; protected set; }
public string ItemName { get; set; }
// Renamed to use same column name as specified in the mapping of Summary.Details
public Summary Summary {get; set;}
}
public class Summary
{
public Summary()
{
Details = new List<Detail>();
}
public int id { get; protected set; }
public IList<Detail> Details { get; protected set; }
}
Mapping:
public class DetailMap : ClassMap<Detail>
{
public DetailMap()
{
Id(x => x.id)
.GeneratedBy.Native();
Map(x => x.ItemName)
.CanNotBeNull();
References<Summary>(x => x.Summary)
// If you don't want to rename the property in Summary,
// you can do this instead:
// .TheColumnNameIs("Summary_id")
.CanNotBeNull();
}
}
public class SummaryMap : ClassMap<Summary>
{
public SummaryMap()
{
Id(x => x.id)
.GeneratedBy.Increment();
HasMany<Detail>(x => x.Details)
.IsInverse()
.AsBag(); // Use bag instead of list to avoid index updating issues
}
}