gpt4 book ai didi

c# - 通过约定的多列唯一约束 FluentNHibernate 自动映射

转载 作者:行者123 更新时间:2023-11-30 15:08:07 25 4
gpt4 key购买 nike

FluentNHibernate 的自动映射是否支持通过约定创建多列唯一约束?

我可以轻松地创建单列唯一约束:

public void Apply(IPropertyInstance instance)
{
if(instance.Name.ToUpper().Equals("NAME"))
instance.Unique();
}

使用验收标准仅查找 ReferenceEntity 类型。

我现在有一个实体,我想为其创建多列唯一约束。我计划用一个属性来装饰实体的属性,以指示它们构成同一唯一键的一部分,即:

public class Foo : Entity
{
[Unique("name_parent")]
public virtual string Name { get; set; }
public virtual string Description { get; set; }

[Unique("name_parent")]
public virtual Bar Parent { get; set; }
}

并让约定查找这些属性并在共享相同唯一键的所有字段中创建一个唯一键。

IProperyConvention 接口(interface)允许您在特定实例(列)上指定 Unique,但对其他列不可见。

更新

发布这个的过程帮助我思考了更多,所以我写下了这个:

var propertyInfo = ((PropertyInstance)(instance)).EntityType.GetMember(instance.Name).FirstOrDefault();

if (propertyInfo != null)
{
var attributes = propertyInfo.GetCustomAttributes(false);

var uniqueAttribute = attributes.OfType<UniqueAttribute>().FirstOrDefault();

if (uniqueAttribute != null)
{
instance.UniqueKey(uniqueAttribute.Key);
}
}

单步执行代码,它会点击 instance.UniqueKey(...) 行两次(如预期的那样),但是创建的约束 (pgsql);

ADD CONSTRAINT foo_name_key UNIQUE(name);

在我预料之中

ADD CONSTRAINT name_parent UNIQUE(name, bar);

更新2

在 AutoMap 配置中使用 Override() 方法时,我可以指定正确的唯一键:

.Override<Foo>(map => {
map.Map(x => x.Name).UniqueKey("name_parent");
map.Map(x => x.Description);
map.References(x => x.Parent).UniqueKey("name_parent");
})

这可能是自动映射器的问题,不确定。仍然不理想,因为它不是通过属性修饰通用的,但现在数据模型反射(reflect)了域需求。

最佳答案

当我这样做时,我创建了 2 个约定,一个是 AttributePropertyConvention,另一个是 IReferenceConvention。我的属性看起来像这样:

public class UniqueAttribute : Attribute
{
public UniqueAttribute(string uniqueKey)
{
UniqueKey = uniqueKey;
}

public string UniqueKey { get; set; }

public string GetKey()
{
return string.Concat(UniqueKey, "Unique");
}
}

我的属性(property)惯例:

public class UniquePropertyConvention : AttributePropertyConvention<UniqueAttribute>
{
protected override void Apply(UniqueAttribute attribute, IPropertyInstance instance)
{
instance.UniqueKey(attribute.GetKey());
}
}

最后是引用约定:

public class UniqueReferenceConvention : IReferenceConvention
{
public void Apply(IManyToOneInstance instance)
{
var p = instance.Property.MemberInfo;

if (Attribute.IsDefined(p, typeof(UniqueAttribute)))
{
var attribute = (UniqueAttribute[])p.GetCustomAttributes(typeof(UniqueAttribute), true);
instance.UniqueKey(attribute[0].GetKey());
}
}
}

希望这适用于您的场景。

关于c# - 通过约定的多列唯一约束 FluentNHibernate 自动映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5972424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com