Я работаю с устаревшей базой данных, где у меня есть две таблицы (Staff, Rights) и объединенная таблица (StaffRights). Я хочу отобразить отношения один ко многим / присоединиться к сотрудникам и сотрудникам. Я использовал полдня, пытаясь выяснить это
С текущим кодом я получаю следующее исключение:
Exception thrown: 'FluentNHibernate.Cfg.FluentConfigurationException' in
FluentNHibernate.dll
Additional information: An invalid or incomplete configuration was used
while creating a SessionFactory. Check PotentialReasons collection, and
InnerException for more detail.
Inner exception:System.ArgumentException: The column 'StaffID' has already been added in this SQL builder Parameter name: columnName at NHibernate.SqlCommand.SqlInsertBuilder.AddColumnWithValueOrType(String
columnName, Object valueOrType) at NHibernate.SqlCommand.SqlInsertBuilder.AddColumns(String[]
columnNames, Boolean[] insertable, IType propertyType)
at NHibernate.Persister.Entity.AbstractEntityPersister.GenerateInsertString(Boolean identityInsert, Boolean[] includeProperty, Int32 j)}
Table1 --> Staff
StaffID: PK
Name
Table2 --> StaffRights
SRID: PK
StaffID:FK
RightID:FK
CreatedTS
Table3 -->Rights
RightID: PK
RightName
public class Staff
{
public virtual int Id { get; protected set; }
public virtual string Name { get; set; }
public virtual IList<StaffRights> RightsAssociation { get; set; }
public Staff()
{
RightsAssociation = new List<StaffRights>();
}
}
public class StaffRights
{
public virtual int Id { get; protected set; }
public virtual int StaffID { get; set; }
public virtual int RightID { get; set; }
public virtual Staff Staff { get; set; }
}
public class StaffMap : ClassMap<Staff>
{
public StaffMap()
{
Id(x => x.Id).Column("StaffID").GeneratedBy.Native();
Map(x => x.Name);
HasMany(x => x.RightsAssociation).KeyColumn("StaffID");
Table("Staff");
}
}
public class StaffRightsMap: ClassMap<StaffRights>
{
public StaffRightsMap()
{
Id(x => x.Id).Column("SRID").GeneratedBy.Native();
Map(x => x.StaffID);
Map(x => x.RightID);
References(x => x.Staff).Column("StaffID");
Table("StaffRights");
}
}
_sessionFactory = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(connStr))
.Mappings(m =>
{
m.FluentMappings.AddFromAssemblyOf<Staff>();
m.FluentMappings.AddFromAssemblyOf<StaffRights>();
})
.BuildSessionFactory();
Я удалил
References(x => x.Staff).Column("StaffID");
ИЯ могу получить некоторые результаты от:
var staff = session.Get<Staff>(2);
var rights = staff.RightsAssociation;
var f = rights.First();
Однако, как я понимаю, отображение должно быть двунаправленным. Что я неправильно понял?