只是用一些 Fluent NHibernate AutoMap 约定弄湿了我的脚,然后遇到了一些我无法弄清楚的事情。我假设我只是没有在正确的地方寻找......基本上试图在一对多关系的“多”方面强制执行 NOT-NULL 。看来,使用自动映射,它总是使数据库中的父属性 Id 可以为空。
我在 StackOverFlow 上进行了一些搜索,发现了类似的问题,但没有与 AutoMapping 和 Conventions 相关的内容(除非我错过了)。
快速示例...
public class Group // One Group
{
public Group() { this.Jobs = new List<Job>(); }
public virtual Guid Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<Job> Jobs { get; protected set; }
}
public class Job // Has many Jobs
{
public virtual Guid Id { get; set; }
public virtual string Name { get; set; }
// Trying to make this field not-nullable in the database.
public virtual Group Group { get; set; }
}
我以为我可以创建一个像...这样的约定
public class OneToManyConvention : IHasOneConvention
{
public void Apply(IOneToOneInstance instance)
{
// Nullable() isn't a valid method...
instance.Not.Nullable();
}
}
但似乎 IOneToOnInstance 没有 Nullable() 方法。如果我为 Job 创建一个 Map 文件,我可以做到这一点,但尽量避免使用任何 Map 文件并坚持使用自动映射。
我在 Fluent 组列表中遇到了这个链接,描述了类似的内容。
它描述了这样的事情......
public class NotNullPropertyConvention : IPropertyConvention
{
public bool Accept(IProperty target)
{
return true;
}
public void Apply(IProperty target)
{
target.Not.Nullable();
}
}
但这引发了以下问题...... 1)我如何确定 IProperty 是一个工作(或任何链接回父级的子属性)
2)它在该页面上提到使用它会覆盖我的手动覆盖,例如。如果一个非常具体的属性链接需要为 NULL。这将是一个问题(如果它仍然是一个问题,但如果不先弄清楚#1就无法测试)
对此有什么想法吗?我只是错过了什么吗?
更新 1
还是不行。即使以下仍然没有在数据库模式中强制执行 Not-Nullable ...
public class FluentConvention : IPropertyConvention
{
public void Apply(IPropertyInstance instance)
{
instance.Not.Nullable();
}
}
不过,它适用于所有其他领域……
/耸肩
有任何想法吗?
更新 2
虽然这不是我正在寻找的答案,但我确实找到了解决方法......我正在使用 NHibernate Validator 程序集,并且在该程序集中有一个 [NotNull] 属性。如果我用 Validator 属性修饰我的类,并在创建模式之前将 ValidationEngine 关联到 NHibernate,它会将 FK 数据库列标记为 Not-Nullable。
public class Job // Has many Jobs
{
public virtual Guid Id { get; set; }
public virtual string Name { get; set; }
[NHibernate.Validator.Constraints.NotNull]
public virtual Group Group { get; set; }
}
如果有人需要 NHibernate + ValidationEngine 初始化的完整代码,请告诉我。仍在寻找一种使用纯映射约定路线的方法,但如果有人有任何信息......
谢谢!