这个让我撕裂了我的头发。我正在使用Fluent NHibernate中的自动化功能,但它似乎有选择地忽略了一些覆盖,但实现其他优先。
不工作:
public class CupTree
{
public virtual int Id { get; set; }
public virtual int TournamentId { get; set; }
public virtual int CurrentRound { get; set; }
public virtual IList<CupRound> Rounds { get; set; }
}
不工作覆盖:
public class CupTreeOverride : IAutoMappingOverride<CupTree>
{
public void Override(FluentNHibernate.Automapping.AutoMapping<CupTree> mapping)
{
mapping.HasMany(x => x.Rounds).Cascade.All();
}
}
架构生成:
public void GenerateSchema()
{
var config = new MappingConfiguration();
Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(/*my conn str*/))
.Mappings(m => m.AutoMappings.Add(
AutoMap.AssemblyOf<CupTree>(config)
.Conventions.Add(
DefaultLazy.Never(),
Table.Is(x => x.EntityType.Name + "s"))
.UseOverridesFromAssembly(Assembly.GetAssembly(typeof(CupTreeOverride)))
))
.ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(false, true))
.BuildSessionFactory();
}
所以,虽然它创建了CupTree表,但它根本不会创建CupRounds表。但它确实创建了PreMatchTeamInfo表及其所有子表。我显然做了一些非常愚蠢的事情,但似乎无法发现它。任何帮助都非常感谢。
答案 0 :(得分:1)
我已设法将其跟踪到列名称。我更改了SchemaUpdate,使其打印出sql语句并运行它们。
这会生成SQL错误,这些错误不会导致我的架构更新失败(表示一切正常)。我使用了名称&#34; Order&#34;作为我的类的属性名称,这当然是SQL中的保留字。我将名称更改为其他名称,一切正常。
对于下一个人,解决此问题的方法是:
使FNH生成hbm.xml文件。您可以通过在AutoMap配置上调用ExportTo来执行此操作:
.Mappings(m => m.AutoMappings.Add(
AutoMap.AssemblyOf<CupTree>(config)
.Conventions.Add(
DefaultLazy.Never(),
Table.Is(x => x.EntityType.Name + "s"))
.UseOverridesFromAssembly(Assembly.GetAssembly(typeof(CupTreeOverride)))
).ExportTo(@"C:\nh.out"))
检查输出的文件并确保一切正确。如果没有,则表明存在映射问题。
如果您的xml文件正常,请检查它运行的SQL语句。您可以通过将SchemaUpdate.Execute上的第一个参数(脚本)设置为true来执行此操作。
.ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(true, true))
复制并粘贴生成的SQL并对数据库运行它。如果有任何问题,您将收到错误并可以从中获取。