我的所有实体和值对象都实现了标记接口IEntity和IValueObject.我把它们设置为像这样的组件:
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)
有没有办法定义一个约定,这样,只要IEntity有IList一个类型实现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
刚刚尝试了一些流畅的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) 在我为应用程序寻求版本范围的数据库过滤器时,我编写了以下代码:
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) 我有两张桌子,地点和设施
他们映射到两个类,
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) 我有一个我无法更改的数据库表,其中包含以下数据:
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
我正在(通过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) 摘要:
我想用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) 我正在使用Fluent NHibernate(1.0 RTM)自动化功能来创建我的oracle数据库模式.我的问题是所有表都使用单个"hibernate-sequence",而我更喜欢(我的老板要求)每个表的序列生成器.
有任何想法吗?
我必须用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的数组.
我有以下类结构
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) automapping ×10
c# ×4
nhibernate ×4
.net-core ×1
automapper ×1
automapper-2 ×1
automapper-3 ×1
components ×1
interface ×1
mysql ×1