首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态组件流畅自动映射

动态组件流畅自动映射
EN

Stack Overflow用户
提问于 2010-05-14 20:32:43
回答 2查看 1.8K关注 0票数 3

有人知道如何在NHibernate中使用Fluent自动映射自动映射动态组件吗?

我知道我们可以将普通类映射为组件,但不知道如何使用fluent自动映射将字典映射为动态组件。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-06 18:45:27

我们已经成功地使用了以下方法(使用FluentNH 1.2.0.712):

代码语言:javascript
复制
public class SomeClass
{
    public int Id { get; set; }
    public IDictionary Properties { get; set; }
}

public class SomeClassMapping : ClassMap<SomeClass>
{
    public SomeClassMapping()
    {
        Id(x => x.Id);

        // Maps the MyEnum members to separate int columns.
        DynamicComponent(x => x.Properties,
                         c =>
                            {
                                foreach (var name in Enum.GetNames(typeof(MyEnum)))
                                    c.Map<int>(name);
                            });
    }
}

在这里,我们将一些枚举的所有成员映射到单独的列,其中所有列的类型都是int。现在,我正在处理一个场景,我们对动态列使用不同的类型,如下所示:

代码语言:javascript
复制
// ExtendedProperties contains custom objects with Name and Type members
foreach (var property in ExtendedProperties)
{
    var prop = property;
    part.Map(prop.Name).CustomType(prop.Type);
}

这也是非常有效的。

我仍然想弄明白的是,如何使用References而不是Map来引用其他有自己映射的类型……

更新:引用的案例不幸更加复杂,请参考this Google Groups thread。简而言之:

代码语言:javascript
复制
// This won't work
foreach (var property in ExtendedProperties)
{
    var prop = property;
    part.Reference(dict => dict[part.Name]);
}

// This works but is not very dynamic
foreach (var property in ExtendedProperties)
{
    var prop = property;
    part.Reference<PropertyType>(dict => dict["MyProperty"]);
}

这就是目前的情况。

票数 5
EN

Stack Overflow用户

发布于 2021-07-17 22:47:56

我也遇到了完全相同的问题。有了fluent nHibernate,我们无法映射这一点,但我自己却能以某种方式解决这个问题。我的解决方案是动态构建lambda表达式,并将其赋值为对象。例如,让我们这样说:

让我复制奥利弗引用的站点的一部分:

代码语言:javascript
复制
DynamicComponent(
    x => x.Properties,
    part =>
    {
        // Works
        part.Map("Size").CustomType(typeof(string));
        // Works
        var keySize = "Size";
        part.Map(keySize).CustomType(typeof(string));
        // Does not work
        part.Map(d => d[keySize]).CustomType(typeof(string));
 
        // Works
        part.References<Picture>(d => d["Picture"]);
        // Does not work
        var key = "Picture";
        part.References<Picture>(d => d[key]);
    });

我们有一个问题,我们需要在映射中硬编码“图片”。但不知何故,在一些研究之后,我创建了以下解决方案:

代码语言:javascript
复制
var someExternalColumnNames = GetFromSomewhereDynamicColumns();

'x' is a DynamicComponent callback in fluent Nhibernate e.g. (DynamicColumns): DynamicComponent(a => a.DynamicColumns, x => (...content of method below...))

foreach(var x in someExternalColumnNames)
{
    if (x.IsReferenceToPerson == true)
    {
        var param = Expression.Parameter(typeof(IDictionary), "paramFirst");
        var key = Expression.Constant(x.Name);
        
        var me = MemberExpression.Call(param, typeof(IDictionary).GetMethod("get_Item"), new[] { key });
        var r = Expression.Lambda<Func<IDictionary, object>>(me, param);
            
        m.References<Person>(r, x.Name);    
    }
    else
    {
        m.Map(x.Name)
    }
}
//

// Some class that we want to reference, just an example of Fluent Nhibernate mapping
    
public class PersonMap : ClassMap<Person>
    {
        public PersonMap()
        {
            Table("Person");
            Id(x => x.PersonId, "PersonId");
            Map(x => x.Name);
        }
    }

    public class Person
    {
        public virtual Guid PersonId { get; set; }

        public virtual string Name { get; set; }

        public Person()
        { }
    }

也许这会对你有所帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2834085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档