Я использую эту статью , чтобы установить взаимно-однозначные отношения между моими двумя объектами - Site
и WebOptions
. Сайт уже присутствует. запись в WebOptions может присутствовать или не присутствовать. Когда это так, мои отображения работают нормально. Когда это не так, моя система взрывается, пытаясь создать новую запись.
Вот мой класс сайта (важные биты)
public class Site : CoreObjectBase
{
public virtual int SiteId { get; set; }
public virtual WebOptions WebOptions { get; set; }
}
А вот мой класс веб-опций (снова важные части)
public class WebOptions : CoreObjectBase
{
public virtual int WebOptionsId { get; set; }
private int SiteId { get; set; }
private Site Site { get; set; }
}
А отображение для Site
равно
HasOne<WebOptions>(x => x.WebOptions)
.Cascade.All();
А отображение для WebOptions
равно
Id(Reveal.Property<WebOptions>("SiteId")).GeneratedBy.Foreign("Site");
HasOne<Site>(Reveal.Member<WebOptions, Site>("Site"))
.Constrained()
.ForeignKey();
В данных таблица за сайтом не имеет поля foreighn для WebOptions, но таблица за WebOptions содержит идентификатор SiteId. В моем коде я уже получаю сайт и использую site.WebOptions.SomeSetting
и хотел бы сохранить его таким.
Моя проблема в этом. Если я вообще отклоняюсь от этого сопоставления, мои разрывы модели и никакие веб-варианты не возвращаются, в то время как несколько записей сохраняются в таблице веб-вариантов (дубликаты). Но когда я пытаюсь сохранить новый объект WebOptions
, я получаю
Пакетное обновление вернуло неожиданное количество строк от обновления; фактическая строка
количество: 0; ожидается: 1
У меня есть класс репозитория с двумя методами сохранения:
public sealed class Repository<T> : IRepository<T> where T : CoreObjectBase
{
public void SaveWithDependence<K>(T entity, K dependant) where K : CoreObjectBase
{
entity.Validate();
dependant.Validate();
using (ITransaction tx = Session.BeginTransaction())
{
Session.SaveOrUpdate(entity);
Session.SaveOrUpdate(dependant);
tx.Commit();
}
}
public void Save(T entity)
{
entity.Validate();
using (ITransaction tx = Session.BeginTransaction())
{
Session.SaveOrUpdate(entity);
tx.Commit();
}
}
}
Когда WebOptions
не найдено, я делаю это при создании нового:
var options = site.WebOptions;
if (options == null)
{
options = new WebOptions(site);
site.WebOptions = options;
}
И конструктор выглядит так, чтобы установить частные переменные
public WebOptions(Site site)
{
Site = site;
SiteId = site.SiteId;
}
А потом, чтобы сохранить, я попытался следующее:
siteRepository.Save(site);
и
siteRepository.SaveWithDependence(site, options);
и
optionsRepository.Save(options);
* * И тысяча сорок-девять
optionsRepository.SaveWithDependence<Site>(options, site);
Все они возвращают вышеуказанную ошибку. Моя сессионная декларация выглядит так
sessionFactory =
Fluently.Configure().Database(
FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2005.DefaultSchema("dbo")
.ConnectionString(c => c
.FromConnectionStringWithKey("MyDatabase"))
.AdoNetBatchSize(20))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<SessionManager>())
.ExposeConfiguration(x => x.SetProperty("current_session_context_class", "managed_web"))
.BuildSessionFactory();
Мне действительно нужно иметь возможность сохранить новую запись WebOptions
, если она не существует, но я не могу заставить ее работать с моими отношениями один на один.