标签: automapping

如何使用Fluent NHibernate自动化一组组件?

我的所有实体和值对象都实现了标记接口IEntityIValueObject.我把它们设置为像这样的组件:

public override bool IsComponent(Type type)
{
    return typeof(IValueObject).IsAssignableFrom(type);
}

public override bool ShouldMap(Type type)
{
    return typeof(IEntity).IsAssignableFrom(type) || typeof(IValueObject).IsAssignableFrom(type);
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这似乎不允许将具有值对象集合的实体自动化为组件集合.例如:

public class MyEntity : IEntity
{
    public IList<MyValueObject> Objects { get; set; }
}

public class MyValueObject : IValueObject
{
    public string Name { get; set; }
    public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法定义一个约定,这样,只要IEntityIList一个类型实现IValueObject,它就像我指定的那样被映射:

HasMany(x => x.Objects)
    .Component(x => { 
        x.Map(m => m.Name); 
        x.Map(m => m.Value); …
Run Code Online (Sandbox Code Playgroud)

nhibernate components fluent-nhibernate automapping value-objects

6
推荐指数
1
解决办法
760
查看次数

流畅的NHibernate强制在外键引用上不可为空

刚刚尝试了一些流畅的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 …
Run Code Online (Sandbox Code Playgroud)

c# fluent-nhibernate automapping

5
推荐指数
1
解决办法
4825
查看次数

在fluentnhibernate automapper中为接口提供AutoMappingOverride的最佳方法是什么?

在我为应用程序寻求版本范围的数据库过滤器时,我编写了以下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FluentNHibernate.Automapping;
using FluentNHibernate.Automapping.Alterations;
using FluentNHibernate.Mapping;
using MvcExtensions.Model;
using NHibernate;

namespace MvcExtensions.Services.Impl.FluentNHibernate
{
    public interface IVersionAware
    {
        string Version { get; set; }
    }

    public class VersionFilter : FilterDefinition
    {
        const string FILTERNAME = "MyVersionFilter";
        const string COLUMNNAME = "Version";

        public VersionFilter()
        {
            this.WithName(FILTERNAME)
                .WithCondition("Version = :"+COLUMNNAME)
                .AddParameter(COLUMNNAME, NHibernateUtil.String );
        }

        public static void EnableVersionFilter(ISession session,string version)
        {
            session.EnableFilter(FILTERNAME).SetParameter(COLUMNNAME, version);
        }

        public static void DisableVersionFilter(ISession session)
        {
            session.DisableFilter(FILTERNAME);
        }
    }

    public …
Run Code Online (Sandbox Code Playgroud)

interface fluent-nhibernate automapping

5
推荐指数
1
解决办法
1234
查看次数

流畅的nHibernate Automapping不会创建多个表名

我有两张桌子,地点和设施

他们映射到两个类,

public Location : Entity
{
   //properties
}

public Facility : Entity
{
    public virtual Location Location { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

一切都工作得很花哨,直到我改变设施

public Facility : Location
{

}
Run Code Online (Sandbox Code Playgroud)

现在我从nHibernate说得到一个例外

NHibernate.ADOException was unhandled by user code
  Message=could not execute query
 InnerException: System.Data.SqlClient.SqlException
       Message=Invalid object name 'Facility'.
Run Code Online (Sandbox Code Playgroud)

由于某种原因,它没有在sql字符串中创建表的复数名称.

谢谢你的帮助!

编辑

这是我目前的TableNameConvention

public class TableNameConvention : IClassConvention
{
    public void Apply(FluentNHibernate.Conventions.Instances.IClassInstance instance)
    {
        instance.Table(Inflector.Net.Inflector.Pluralize(instance.EntityType.Name));
    }
}
Run Code Online (Sandbox Code Playgroud)

当Facility从Entity继承时,Facility会运行此方法.当它从Location继承时,它不会

编辑2想我发布的一切...... 数据库图

public class AutoPersistenceModelGenerator : IAutoPersistenceModelGenerator
{

    #region IAutoPersistenceModelGenerator Members

    public AutoPersistenceModel Generate()
    { …
Run Code Online (Sandbox Code Playgroud)

fluent-nhibernate automapping

5
推荐指数
1
解决办法
2486
查看次数

流畅的NHibernate - 将多行展平为一个实体

我有一个我无法更改的数据库表,其中包含以下数据:

FooTable
Id     | EntityAUniqueId | EntityBUniqueId | EntityCUniqueId
============================================================
1      | A1              | B1              | C1
2      | A1              | B1              | C2
3      | A1              | B2              | C3
4      | A1              | B2              | C4
5      | A2              | B3              | C5
6      | A2              | B3              | C6
7      | A2              | B4              | C7
8      | A2              | B4              | C8
Run Code Online (Sandbox Code Playgroud)

我想将此映射到以下结构:

interface IEntityA
{
    string UniqueId { get; }
    IEnumerable<IEntityB> { get; }
} …
Run Code Online (Sandbox Code Playgroud)

nhibernate entity-relationship fluent-nhibernate automapping

5
推荐指数
1
解决办法
515
查看次数

流畅的NHibernate自动映射:将日期时间更改为时间戳

我正在(通过NHibernate的流畅界面)深入了解自动化.非常好,但我遇到了DateTimes的一个小问题.我需要将数据格式更改为时间戳,否则NHibernate会截断毫秒数.

我找到了几个信息来源,最好的信息来源是: AutoMapping Info 1他在哪里更改列名和属性类型.问题是,根据这份文件,流畅的自动化有所改变.

现在我无法弄清楚如何让自动化"改变类型".我尝试了下面的代码,但我被卡住了.同样,我想要做的只是告诉automapper:

使用DateTime的时间戳可以防止在使用自动化时截断毫秒.

有人有个主意吗?代码到目前为止:

   public class DateTimeToTimestamp : IClassConvention  
{  
    public bool Accept(IClassMap target)
    {
        return target.GetType() == typeof(DateTime);
    }

    public void Apply(IClassMap target)
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

好的,非常感谢答案......这对我来说足够舒适.如果我真的有3个需要这种精度的类,我可以处理三次写入.特别是因为所有其他属性的映射仍然完美,并且以下代码仅替换我想要的一个属性...非常好!

如果有人知道更通用的方法,请随意添加它,但是现在,我很高兴!

我案件的代码是:

    public class DateTimeToTimestamp : IAutoMappingOverride<CustomTime>
{
    public void Override(AutoMap<CustomTime> mapping)
    {
        mapping.Map(x => x.ScanDate).CustomTypeIs("timestamp");
    }
}
Run Code Online (Sandbox Code Playgroud)

c# nhibernate fluent-nhibernate automapping

4
推荐指数
1
解决办法
6266
查看次数

使用AutoMapping流畅的NHibernate DuplicateMappingException

摘要:

我想用Fluent NHibernate Automapper保存两个相同名称和不同名称空间的类

上下文

我写的是必须将许多不同的对象导入数据库进行测试.我最终会将mappers写成一个合适的模型.

我一直在使用code gen和Fluent NHibernate来获取这些DTO并将它们直接转储到db.

例外情况确实说(尝试使用auto-import ="false")

public class ClassConvention : IClassConvention
{
    public void Apply(IClassInstance instance)
    {
        instance.Table(instance.EntityType.Namespace.Replace(".", "_"));
    }
}

namespace Sample.Models.Test1
{
    public class Test
    {
        public virtual int Id { get; set; }
        public virtual string Something { get; set; }
    }
}

namespace Sample.Models.Test2
{
    public class Test
    {
        public virtual int Id { get; set; }
        public virtual string SomethingElse { get; set; }        
    }
}
Run Code Online (Sandbox Code Playgroud)

这是实际的应用程序代码

            var model …
Run Code Online (Sandbox Code Playgroud)

mysql fluent-nhibernate automapping

4
推荐指数
2
解决办法
4177
查看次数

帮助制作Fluent NHibernate为每个表创建一个oracle序列

我正在使用Fluent NHibernate(1.0 RTM)自动化功能来创建我的oracle数据库模式.我的问题是所有表都使用单个"hibernate-sequence",而我更喜欢(我的老板要求)每个表的序列生成器.

有任何想法吗?

c# nhibernate fluent-nhibernate automapping

4
推荐指数
1
解决办法
1571
查看次数

从源到目标的自动映射映射,包含对象列表

我必须用automapper创建一个Mapping.

Public class Source
{
    public string Id;
    public string Firstname;
    public string Lastname;
}
Run Code Online (Sandbox Code Playgroud)

目的地是

Public class Destination
{
    public string Id;
    public Person[] persons;
}
Run Code Online (Sandbox Code Playgroud)

人类是

Public class Person
{
    public string FirstName;
    public string LastName;
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建映射

AutoMapper.Mapper.CreateMap<Source, Destination>(); 
Run Code Online (Sandbox Code Playgroud)

但我不知道如何将Firstname,Lastname映射到对象Person的数组.

automapping automapper automapper-2 automapper-3

4
推荐指数
1
解决办法
1782
查看次数

自动映射嵌套对象

我有以下类结构

public class ClassA
{
    public ClassB objB;
}

Public class ClassB
{
    public ListOfData objListofData;
}

public class ListOfData 
{
    public Employee objEmp;
}

public class Employee
{
    public string FirstName;
    public string LastName;
}
Run Code Online (Sandbox Code Playgroud)

上面层次结构的返回类型是

"ClassA":{
    "classB":{
        "ListOfData":{
            "employee":{
                "FirstName":"David",
                "LastName" :"Peter"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想将employee类映射到EmployeeViewModel,其中Employee firstname和lastname将映射到employeeViewModel FullName属性.我可以通过遵循一段代码来实现这一点

public class EmployeeViewModel
{
    public FullName;
}


CreateMap<Employee,EmployeeViewModel>()
                         .ForMember(dest => dest.FullName,
                                    opts => opts.MapFrom(
                                        src => string.Format("{0} {1}",
                                        src.FirstName, src.LastName)));
Run Code Online (Sandbox Code Playgroud)

现在我如何返回原始classA对象,它具有EmployeeViewModel的映射.这样的事情?

"ClassA":{
    "classB":{
        "ListOfData":{
            "EmployeeViewModel":{
                "FullName":"David Peter"
            }
        } …
Run Code Online (Sandbox Code Playgroud)

c# automapping asp.net-web-api .net-core

4
推荐指数
1
解决办法
2442
查看次数