У меня есть отношение родительских детей и в настоящее время существует только ссылка от каждого дочернего элемента к родительскому (есть столбец внешнего ключа в дочерней таблице). Я хотел бы добавить родительское свойство readnly IEnumerable, но я не могу этого сделать.Сопоставление по коду - двустороннее отношение
public class ProjectData : Entity
{
public virtual long Id {get;set;}
private readonly IList<BranchData> _branches = new List<BranchData>();
public virtual IEnumerable<BranchData> Branches
{
get { return _branches.AsReadOnly(); }
}
}
public class BranchData : Entity
{
puplic virtual long Id {get;set;}
public virtual ProjectData ProjectData { get; set; }
}
public class BranchDataMapping : ClassMapping<BranchData>
{
public BranchDataMapping()
{
ManyToOne(x => x.ProjectData, mapper => { });
}
}
public class ProjectDataMapping : ClassMapping<ProjectData>
{
public ProjectDataMapping()
{
Bag(data => data.Branches,
mapper =>
{
mapper.Access(Accessor.ReadOnly);
mapper.Inverse(false);
}, relation => relation.OneToMany());
}
}
Имена таблиц и столбцов создаются условными обозначениями. Когда я создаю и сохраняю новый BranchDate с набором родительских свойств, он не отображается в коллекции ветвей родителя.
Какую настройку мне не хватает?
Я прочитал Bi-directional NHibernate mapping by code и http://notherdev.blogspot.cz/2012/02/nhibernates-mapping-by-code-summary.html, и я все еще не могу установить его должным образом.
Edit: Код, который проверяет это поведение
[Test]
public void CanSaveAndLoadBranch()
{
var session = InMemoryDatabase.GetSession();
var project = new ProjectData {Name = "ratata"};
var branch = new BranchData {ProjectData = project};
using (var tx = session.BeginTransaction())
{
session.Save(project);
session.Save(branch);
tx.Commit();
}
var branches = project.Branches;
//branches are empty
var freshProject = session.Query<ProjectData>().Where(x => x.Id == project.Id).First();
var freshBranches = freshProject.Branches;
//branches are empty here, too
var fetched = session.Query<ProjectData>().Where(x => x.Id == project.Id).FetchMany(x => x.Branches).First();
var fetchedBranches = fetched.Branches;
//branches are empty here, too
var queriedOn = session.Query<ProjectData>().Where(x => x.Branches.Any()).ToList();
//this does return the project, but Branches property is still empty
}
Вы пытаетесь перечислить коллекцию ветвей в том же ISession, который использовался для создания сохранения свойства Branch with Project? Если вы делаете это, попробуйте использовать другое ISession. Возможно, команда сохранения регистра в базе данных еще не была очищена. – cidico
Можете ли вы показать код, который вы используете для этого: «создайте и сохраните новый BranchDate с набором родительских свойств», а также код, который проверяет это: «он не отображается в коллекции« Ветки »родителя». –
Я добавлю его на вопрос –