流畅的NHibernate映射

时间:2009-08-26 16:11:35

标签: .net fluent-nhibernate

我是NHibernate和Fluent NHibernate的新手。

假设我遇到以下情况

Table Activities (uniquidentier ID, varchar ActivityName)
Table ActivityParameters(uniqueidentifier ID, varchar ParameterName,
 varbinary(8000) ParameterValue)

和以下课程

public static Acivity
{
     .......
     public virtual Guid Id {get; private set;}      
     public virtual string ActivityName {get; private set;}
     public virtual IDictionary<string, object> ActivityParameters {get; private set;}
}

我该如何编写类图?更具体地说,我如何编写活动参数​​的映射?

5 个答案:

答案 0 :(得分:16)

一位同事指出this site

根据讨论,我来

Table("Activities");
        Id(x => x.Id).Column("ID").GeneratedBy.Guid();
        Map(x => x.ActivityName).Not.Nullable().Length(50);
        HasMany(x => x.ActivityParameters)
            .KeyColumn("ActivityID")
            .AsMap<string>(idx => idx.Column("ParameterName"), elem => elem.Column("ParameterValue"))
            .Not.LazyLoad()
            .ForeignKeyCascadeOnDelete()
            .Table("ActivityParameters");

我必须测试一下。

答案 1 :(得分:0)

This似乎很有帮助。

理论上它应该看起来像:

public class ActivityClassMap : ClassMap<Activity>
{
    ...
    HasMany(x => x.ActivityParameters) 
      .AsMap(x=>x.NameOfParameterOrWhatever)
      .KeyColumnNames.Add("ParameterId"); 
    ...
}

但这只是通过谷歌进行的一项小规模调查 - 我没有在实践中尝试这一点。

P.S。不要忘记拿起最新版本。

答案 2 :(得分:0)

根据你的提示,我来了:

WithTable("Activities"); 
Id(x => x.Id).ColumnName("ID").GeneratedBy.Guid(); 
Map(x => x.ActivityName).Not.Nullable().WithLengthOf(50); 
HasMany(x => x.ActivityParameters) 
        .Cascade.Delete() 
        .KeyColumnNames.Add("ActivityID") 
        .AsMap("ParameterName") 
        .AsMap("ParameterValue") 
        .WithTableName("ActivityParameters");

但是我得到一个错误,Association引用了未映射的类:System.Object。 :(

稍后编辑:我得到了最新版本的Fluent,现在代码如下:

Table("Activities");
        Id(x => x.Id).Column("ID").GeneratedBy.Guid();
        Map(x => x.ActivityName).Not.Nullable().Length(50);
        HasMany(x => x.ActivityParameters)
            .KeyColumn("ActivityID")
            .ForeignKeyCascadeOnDelete()
            .Table("ActivityParameters");

答案 3 :(得分:0)

您实际上需要定义IDictionary中的value属性包含的对象类型 - NHibernate不知道如何映射。您应该使用特定的类而不是。然后,您也可以为此类指定映射。

答案 4 :(得分:-1)

请原谅我的无知。

我大约6个月前在NHibernate工作过,我们仍然选择XML集成映射,然后编译库中的XML映射或者无论如何。

这是新的直接从代码中映射关系表和类对象吗?

我听说这是通过在方括号内的类的每个元素之上指定映射而实现的实体框架。因此,由于实体框架仅用于SQL Server,我们无法考虑使用它,因为我们在SQL Server,Oracle和SQLite的多数据库环境中工作。

感谢关于这个主题的任何照明! : - )