c# - Fluent NHibernate 在外键引用上强制执行不可为空

标签 c# fluent-nhibernate automapping

刚接触一些 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 文件并坚持使用自动映射。

我遇到了这个 link on the Fluent group list描述类似的东西。

它描述了这样的事情......

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 初始化的完整代码,请告诉我。 仍在寻找一种使用纯映射约定路线来完成它的方法,尽管如果有人有任何信息......

谢谢!

最佳答案

您可以在 Fluenttly.Configure() 中覆盖自动映射的属性作为 AutoMap 的一部分。

所以你可以这样做:

.Override<Job>(map => map.References(x => x.Group).Not.Nullable())

如果你有很多类需要这个,这就不太方便了。

编辑: 您还可以在实现 IAutoMappingOverride 的类中指定重写,如下所示:

    public class JobMappingOverride : IAutoMappingOverride<Job>
    {
            public void Override(AutoMapping<Job> mapping)
            {
                    mapping.References(x => x.Group).Not.Nullable();
            }
    }

并像这样包含它:

    .UseOverridesFromAssemblyOf<JobMappingOverride>()

这将使您的 Fluent 配置更加简洁。

关于c# - Fluent NHibernate 在外键引用上强制执行不可为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1791582/

相关文章:

c# - 如何从 wpf 中的代码隐藏更改控件的 Grid.Row 和 Grid.Column

c# - System.Windows.Forms.Screen.DeviceName 在 Windows XP 上产生垃圾

.net - Fluent NHibernate 和 migratordotnet 可以很好地配合使用吗?

c# - 在 Fluent NHibernate 中创建复合索引?

fluent-nhibernate - 向 Fluent Nhibernate 自动映射类的属性添加(唯一)索引

fluent-nhibernate - 我可以使用 Fluent NHibernate 自动映射树层次结构吗?

c# - 使用 LINQ 使用相同的值填充 List<string>

c# - 在 mysql 连接上“使用”

c# - session 关闭后加载子对象

fluent-nhibernate - 使用自动映射时如何关闭流畅的 nhibernate 中的标识符生成