【发布时间】:2011-04-20 09:34:19
【问题描述】:
我从 NH 得到一个 SQL 查询,它正在生成一个不存在的列(因此从 NH 产生一个 ADOException)。
SELECT roles0_.CreatedBy_id as CreatedBy4_1_,
roles0_.Id as Id1_,
roles0_.Id as Id18_0_,
roles0_.RoleDescription as RoleDesc2_18_0_,
roles0_.User_id as User3_18_0_
FROM [Role] roles0_
WHERE roles0_.CreatedBy_id=?
我的问题是我无法弄清楚CreatedBy 列的来源。这是我的班级结构。
public abstract class DomainEntity
{
public virtual int Id { get; set; }
}
public class User : DomainEntity
{
/* all the regular stuff you'd expect */
public virtual IList<Role> Roles { get; private set; }
}
public class Role : DomainEntity
{
public virtual User User { get; set; }
public virtual string RoleDescription { get; set; }
}
在应用启动时,我可以检查配置,并且可以看到角色类映射的ColumnIterator。它在字典中有 4 个项目:id、user_id、roledescription 和 createdby_id。所以查询基于配置是合法的,但我无法根据类弄清楚配置。
是的,我已经清除了我的 ASP.NET DLL 缓存,删除了 bin 和 obj 目录,以及我能想到的任何其他内容。
编辑#1
这是我的 Fluently.Configure 声明
_configuration = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(_connectionString))
.Mappings(m => m.AutoMappings.Add(GetPersistenceModel()))
.BuildConfiguration();
这是我对GetPersistenceModel()的呼吁
private static AutoPersistenceModel GetPersistenceModel()
{
var configuration = new CustomAutomappingConfiguration();
return AutoMap.AssemblyOf<User>(configuration)
.IgnoreBase(typeof(DomainEntity))
.UseOverridesFromAssemblyOf<UserMapOverride>()
.Conventions.Setup(c =>
{
c.Add<CustomHasManyConvention>();
});
}
我的自定义配置说只映射公共自动属性。这样我就可以将其他计算属性添加到我的域实体中。用户映射覆盖确保表名是[User],因为我只使用User 就遇到了SQL 错误。 Custom HasMany 约定为 all 设置 cascade all-delete-orphan 有很多关系。
编辑#2
这会变得更好。这是创建配置对象之后,创建会话工厂对象之前的列迭代器。
看到了吗?映射列列表中没有 createdby_id 列。这是创建会话工厂对象后的列迭代器。
现在有一个createdby_id 列。我现在真的迷路了。
编辑 3
好的,我想我现在正在做点什么。
上周我收到了客户的新要求。这个要求是他们想知道谁创建了一个任务。所以它有一个新的属性如下。
public class Assignment : DomainEntity {
/* etc. */
public virtual User CreatedBy { get; set; }
/* etc. */
}
在我的分配表中,它现在有一个这样的列。
[CreatedBy_id] INT NULL
这个新列上的用户表有一个 FK。
如果我注释掉这个属性,一切都会恢复正常。 SQL 回到通过user_id 进行查询,这正是我所期望的方式。我可以使用某种类型的覆盖来防止这种情况发生吗?
【问题讨论】:
-
您使用的是 AutoMapping 还是 ClassMaps?您可以发布您的 Fluently.Configure 通话吗?
-
您能向我们展示您的完整个实体吗?
_id后缀表示它是一个已映射的外键关系,因此在您的域中某处必须有一个CreatedBy属性或类;自动映射器通过反映程序集中的属性和类来工作,它不能只是弥补。 -
请发布您的
CustomHasManyConvention&UserMapOverride。
标签: fluent-nhibernate automapping