AndrewSwerlick
AndrewSwerlick

Reputation: 913

Fluent Nhibernate Cascade.None() results in HasOne foreign key relationship not being persisted

I'm having issues with Nhibernate persisting a HasOne Relationship for one of my entities with Cascade.None() in effect. My domain model involves 4 classes listed below.

public class Project 
{
   public virtual int Id {get;set;}
   public virtual IList<ProjectRole> Team { get; protected set; }
}

public class ProjectRole
{
    public virtual int Id { get; set; }
    public virtual User User { get; set; }
    public virtual Role Role { get; set; }
}

public class Role
{
    public virtual int Id { get; set; }
    public virtual string Value { get; set; }
}

public class User
{
    public virtual int Id { get; protected set; }
    public virtual string LoginName { get; set; }
}

So basically we have projects, which have a list of ProjectRoles available from the Team property. Each ProjectRole links a User to the specific Role they play on that project.

I'm trying to setup the following cascade relationships for these entities.

project.HasMany<ProjectRoles>(p=> p.Team).Cascade.All()
projectRole.HasOne<Role>(r => r.Role).Cascade.None()
projectRole.HasOne<User>(r => r.User).Cascade.SaveUpdate()

I've used fluent nhibernate overrides to setup the cascades as above, but I'm finding that the line

projectRole.HasOne<Role>(r => r.Role).Cascade.None()

is resulting in the ProjectRole.Role property not being saved to the database. I've diagnosed this be looking at the SQL Generated by Nhibernate and I can see that the "Role_id" column in the ProjectRoles table is never set on update or insert.

I've also tried using

projectRole.HasOne<Role>(r => r.Role).Cascade.SaveUpdate()

but that fails as well. Unfortunately leaving it Cascade.All() is not an option as that results in the system deleting the Role objects when I try to delete a project role.

Any idea how to setup Cascade.None() for the ProjectRole-> Role relationship with out breaking persistence.

Upvotes: 0

Views: 1176

Answers (1)

Jamie Ide
Jamie Ide

Reputation: 49251

HasOne is for a one-to-one relationship which are rare. You want to use References to declare the one side of a one-to-many relationship. Making some assumptions about your domain model, the mapping should look like:

project.HasMany<ProjectRoles>(p=> p.Team).Inverse().Cascade.AllDeleteOrphan()
projectRole.References<Role>(r => r.Role);
projectRole.References<User>(r => r.User);

See also this question about the difference between HasOne and References.

Upvotes: 1

Related Questions