流利的NHibernate的映射(Fluent NHibernate mapping)

2019-08-02 16:37发布

我是新来NHibernate和流利的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;}
}

我怎么能写的类映射? 更具体地讲,我怎么能写activityparameters映射?

Answer 1:

一位同事指出E要这个网站 。

在此基础上讨论,我来

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");

我来测试一下这个。



Answer 2:

这似乎是有帮助的。

理论上应该是这样的:

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

但是,这只是谷歌通过一个小调查 - 我并没有在实践中尝试。

PS不要忘记拿起最新版本。



Answer 3:

实际上,你需要定义什么样的对象的IDictionary你的价值属性不包含 - NHibernate的不知道如何映射。 您应该使用特定的类来代替。 然后你指定了这个类的映射为好。



Answer 4:

根据你的提示,我来:

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");

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

后来编辑:我得到了最新版的流利,现在的代码如下所示:

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");


Answer 5:

请原谅我的无知。

我大约6个月前NHibernate的工作,仍然是我们选择了XML集成映射,然后编译库或任何内部的XML映射。

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

我听说这是实体框架出来,通过指定只是在方括号内的类中的每个元素的顶部映射莫名其妙地来了。 因此,由于实体框架是专为与SQL Server使用,我们也想不出用它作为我们在多数据库环境中使用SQL Server,Oracle和SQLite的进行工作。

感谢您对这个问题的任何灯光! :-)



文章来源: Fluent NHibernate mapping