Har nu suttit hela kvällen igår och morgonen idag för att försöka koppla ihop två objekt genom mappningar i NHibernate, och det blir bara fel, fel, fel...
Det jag vill åstadkomma är att koppla ihop mitt coworker-objekt med role-objektet och på så vis genom NHibernate tilldela en användare en (eller flera) roller, samtidigt som användaren läggs till i coworker-tabellen.
Har testat en mängd variationer, läst dokumentationen, läst artiklar på nätet och testat att använda Cyuahoga som referens... Utan resultat
Iaf:
Databas:
Tabell Coworkers
CoworkerID int
Name nvarchar(50)
Password nvarchar(50)
Tabell Roles
RoleID int
Name nvarchar(50)
PermissionLevel int
Tabell CoworkerRole
CoworkerRoleID int
CoworkerID int
RoleID int
Classer
Coworker.cs (namespaces: System, System.Collections)
private int _id;
private string _name;
private string _password;
private IList _roles;
(+ publika properties som hanterar de interna variablerna)
Role.cs (namespace: System)
private int _id;
private string _name;
private int _permissionLevel;
(+ publika properties som hanterar de interna variablerna)
Mappningsfiler:
Coworker.hbm.xml:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="Metalstore.Core.Domain.Coworker, Metalstore.Core" table="Coworkers" proxy="Metalstore.Core.Domain.Coworker, Metalstore.Core">
<cache usage="read-write" />
<id name="Id" column="CoworkerID" type="Int32" length="4" unsaved-value="0">
<generator class="native">
<param name="sequence">Metalstore.core_Coworker_CoworkerID_seq</param>
</generator>
</id>
<property name="Name" column="Name" type="String" length="50" />
<property name="Password" column="Password" type="String" length="50" />
<bag name="Roles" table="CoworkerRole" cascade="none" lazy="true">
<jcs-cache usage="read-write" />
<key column="CoworkerID" />
<many-to-many class="Metalstore.Core.Domain.Role,Metalstore.Core" column="RoleID" outer-join="true" />
</bag></class>
</hibernate-mapping>
Role.hbm.xml:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="Metalstore.Core.Domain.Role,Metalstore.Core" table="Roles">
<cache usage="read-write" />
<id name="Id" column="RoleID" type="Int32" length="4" unsaved-value="0">
<generator class="native">
<param name="sequence">Metalstore.core_Roles_RoleID_seq</param> </generator>
</id>
<property name="Name" column="Name" type="String" length="50" />
<property name="PermissionLevel" column="PermissionLevel" type="Int32" length="4" />
</class>
</hibernate-mapping>
Anropning:
private Coworker _admin = new Coworker();
public void SaveAdmin(string Name, string Password)
{
try
{
_admin.Name = Name;
_admin.Password = Encryption.StringToMd5Hash(Password);
SetRoles();
UpdateConfig();
base.Datacore.SaveObject(this._admin);
System.Web.HttpContext.Current.Response.Redirect("metalstore/metalstore.web/management.aspx");
}
catch
{
throw;
}
}
private void SetRoles()
{
[B]this._admin.Roles.Clear(); <- fel inträffar här[/B]
int roleId = 1;
Role role = (Role)base.Datacore.GetObjectById(typeof(Role), roleId);
[B]this._admin.Roles.Add(role); <- fel inträffar här[/B]
}
**Felmeddelande:
Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.**
Allt annat fungerar som det ska, tar jag bara bort rollhanteringen så sparas användaren i databasen, och jag kan hämta roller och plocka ut deras ids, namn, permissions utan problem. Allt feleri inträffar alltså när rollerna ska laddas till en IList (och kopplas till ett coworker-objekt).
Ni kan säkert lösa detta snabbt, men för mig som har pysslat med .net i snart en månad är det ett jävla helvete. Tack på förhand iaf.