I am using ConfORM Nhibernate in one of my MVC project. And had problem with One to Many Mappings.
IEnumerable<Type> domainEntities = this.GetDomainEntities();
var relationalMapper = new ObjectRelationalMapper();
relationalMapper.TablePerConcreteClass(domainEntities);
relationalMapper.Patterns.PoidStrategies.Add(new NativePoidPattern());
relationalMapper.Cascade<Category, Product>(Cascade.All);
relationalMapper.ManyToMany<Category, Product>();
relationalMapper.Cascade<Order, Product>(Cascade.Persist);
var mapper = new Mapper(relationalMapper);
var englishInflector = new EnglishInflector();
mapper.PatternsAppliers.Merge(new ClassPluralizedTableApplier(englishInflector));
mapper.PatternsAppliers.Merge(new OneToManyKeyColumnApplier(relationalMapper));
.....
HbmMapping mapping = mapper.CompileMappingFor(domainEntities);
And classes Order and User: One User had many Orders.
public class Order : BaseEntity
{
public Order(User user)
{
if (user == null)
{
throw new ArgumentNullException("user");
}
this.User = user;
}
protected Order()
{
}
public virtual User User { get; protected set; }
}
And Users:
public class User : BaseEntity
{
public User()
{
this.Orders = new HashedSet<Order>();
}
public virtual string FirstName { get; set; }
public virtual ISet<Order> Orders { get; protected set; }
}
I expect relations like this: Orders.UserId -> User.Id in the DB. But when the Nhibernate had genereted DB we had this problem (See image):
UPS. Double reference User and UserId suddenly uppeared. And when we removed [user] Nhivernate can`t do inner join this tables. It sad that double time: Invalid column name 'User'. Invalid column name 'User'.
I think there is some problems with setuping ConfORM. If I remove mapper.PatternsAppliers.Merge(new OneToManyKeyColumnApplier(relationalMapper)); ConfORM generete just [User] reference key.
Anyone know what the problem is here? Thanks in Advance.
You need to add the following applier
mapper.PatternsAppliers.Merge(new ManyToOneColumnApplier());
Probably thats because column name has changed from Users side, but has not changed from Order side.