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
Probably thats because column name has changed from Users side, but has not changed from Order side.