Мы реализовали нашу модель предметной области, используя шаблон подотчетности, который мы пытаемся сохранить, используя NHibernate с беглым NHibernate для определения карт.
Фактически у нас есть 3 сущности, Подотчетность (используется для определения взаимосвязи междустороны), Сторона (используется для определения стороны, например, контакт, лицо, бизнес и т. д.) и тип AccountabilityType (используется для указания отношения подотчетности, т. е. «принадлежит», «принадлежит» и т. д.)
Я являюсьврезаться в кирпичную стену с точки зрения определения карт.
ERD выглядит следующим образом (новые пользователи aaarrgg не могут публиковать изображения, жизнь и ее небольшие проблемы):
Я надеюсь, что карты высможет выяснить ERD.
Сущности определены следующим образом (они были ошарашены для тестирования):
public class AccountabilityType
{
public virtual string Id { get; set; }
public override int GetHashCode()
{
return Id.GetHashCode();
}
public override bool Equals(object obj)
{
var other = obj as AccountabilityType;
if (other == null)
return false;
return other.GetHashCode() == GetHashCode();
}
}
public class Accountability
{
#region Properties
public virtual Guid Id { get; set; }
public virtual Party Parent { get; set; }
public virtual Party Child { get; set; }
public virtual AccountabilityType Type { get; set; }
#endregion
#region Methods
public override int GetHashCode()
{
return Type.GetHashCode() ^ Parent.GetHashCode() ^ Child.GetHashCode();
}
public override bool Equals(object obj)
{
var other = obj as Accountability;
if (other == null)
return false;
return other.GetHashCode() == GetHashCode();
}
#endregion
}
public class Party
{
public Party()
{
ParentAccountabilities = new List<Accountability>();
ChildAccountabilities = new List<Accountability>();
}
#region Properties
public virtual Guid Id { get; set; }
public virtual string Name { get; set; }
public virtual string Type { get; set; }
// Exposed for persistence, Hackity Hack, dont hate the player hate the game
public virtual IList<Accountability> ParentAccountabilities { get; set; }
// Exposed for persistence, Hackity Hack, dont hate the player hate the game
public virtual IList<Accountability> ChildAccountabilities { get; set; }
#endregion
#region Overrides
public override int GetHashCode()
{
return Type.GetHashCode() ^ Name.GetHashCode();
}
public override bool Equals(object obj)
{
var other = obj as Party;
if (other == null)
return false;
return other.GetHashCode() == GetHashCode();
}
#endregion
}
И, наконец, текущие карты отображаются следующим образом:
public class AccountabilityTypeMap : ClassMap<AccountabilityType>
{
public AccountabilityTypeMap()
{
Id(p => p.Id).GeneratedBy.Assigned();
}
}
public class AccountabilityMap : ClassMap<Accountability>
{
public AccountabilityMap()
{
Id(p => p.Id).GeneratedBy.Guid();
References(p => p.Parent, "ParentId").Cascade.None();
References(p => p.Child, "ChildId").Cascade.All();
References(p => p.Type, "AccountabilityTypeId").Cascade.None();
}
}
public class PartyMap : ClassMap<Party>
{
public PartyMap()
{
Id(p => p.Id).GeneratedBy.Assigned();
Map(p => p.Name);
Map(p => p.Type);
HasManyToMany(p => p.ChildAccountabilities)
.Table("Accountability")
.ParentKeyColumn("ChildId")
.ChildKeyColumn("ParentId")
.Cascade.All();
HasManyToMany(p => p.ParentAccountabilities)
.Table("Accountability")
.ParentKeyColumn("ParentId")
.ChildKeyColumn("ChildId")
.Cascade.None()
.Inverse();
}
}
Объекты сохраняются в БД, однако NHibernate выдает ошибку session.Flush (), и ошибка указывает, чтоон пытается вставить объект подотчетности с нулевым идентификатором.Это в первую очередь невозможно, поскольку идентификатор является необнуляемым Guid, и я прошел через объектную модель, чтобы убедиться, что нет объекта с нулевым / пустым идентификатором.
Любые предложения будут наиболее цениться:)
Спасибо