我喜欢Fluent NHibernate来构建我的数据库,到目前为止还没有找到限制让我陷入困境.
但是在我当前的项目中,我希望在产品生命周期的早期阶段就可以发布到生产环境,因此随着我们的进步,期望在数据库模式中进行许多小的更改.
我想使用像migratordotnet这样的工具跟踪"迁移"中的这些DDL和DML更改.但我的问题是:是否有可能让这两个工具(或类似工具)协同工作?
根据DRY的精神,如何从Fluent Nhibernate中的映射中获取模式更改?这可能吗?
或者更好的方法是将模式生成留给像migratordotnet这样的工具,并让Fluent NHibernate只具有映射的可响应性?嗯,这看起来似乎更好地分离了工具级别的问题.
干杯!
我想用流利的Nhibernate映射这样的东西,但我不知道如何映射库存表
这是我的表格:
产品(身份证,姓名,......)
仓库(Id,Name,...)
库存(Product_id,Warehouse_id,StockInHand)
我已经像下面那样映射了产品和仓库
公共产品地图(){
Run Code Online (Sandbox Code Playgroud)Id(x => x.Id); Map(x => x.Name); HasManyToMany(x => x.StoresStockedIn) .Cascade.All() .Inverse() .Table("Inventory"); }public WarehouseMap()
Run Code Online (Sandbox Code Playgroud){ Id(x => x.Id); Map(x => x.Name); HasManyToMany(x => x.Products) .Cascade.All() .Table("Inventory"); }
我面临的问题是如何映射StockInHand(库存模型应如何映射?).
或者有其他方式来模拟这种情况吗?
我已经阅读了一些现有的问题,但尚未清楚地了解该怎么做.
谢谢
我有一个困难的数据库设计决策,为我的客户基于网络的CRM的越来越多的分支机构提供多租户,我积极维护.
我很早就决定为每个分支使用单独的应用程序和单独的数据库,因为这是满足不同数据和代码要求的三个不同分支的最简单方法.我还想避免在每个查询中管理租户ID ,就像我在2007年建立的遗留经典ASP(cringe)应用程序一样......恐怖.
但现在分支机构的数据需求正在趋同,随着业务的扩展,我需要能够快速推出新的分支机构并共享全球产品SKU.
由于所有分支的表和视图都相同,并且现在可以使用更好的ORM工具来管理多租户应用程序,我想知道为多个分支创建共享数据库是否更好.
不太可能有多达10个分支机构.现在有3个.
在这方面具有实际经验的开发人员,您在我的情况下会做些什么?将应用程序和数据库分开,还是组合成一个巨大的系统?
编辑:伟大的微软的文章在多租户亲的利弊.我应该注意,分支之间的数据隔离不是主要问题.
sql-server asp.net database-design fluent-nhibernate multi-tenant
我正在尝试使用Fluent NHibernate来迁移需要某些数据库"按摩"的数据库.源数据库是MS Access数据库,我粘贴的当前表是一个带有OLE对象字段的表.目标数据库是MS SQL Server Express数据库.
在实体中我简单地将此字段定义为a byte[]但是在加载时,即使只是为单个记录加载该单个字段,我也遇到了System.OutOfMemoryException
byte[] test = aSession.Query<Entities.Access.Revision>().Where(x => x.Id == 5590).Select(x => x.FileData).SingleOrDefault<byte[]>();
Run Code Online (Sandbox Code Playgroud)
然后我尝试实现此处列出的blob类型,但现在运行时我收到错误:
"无法将'System.Byte []'类型的对象强制转换为'TestProg.DatabaseConverter.Entities.Blob'."}
我无法想象Ole对象是否大于100mb但无法检查.有没有什么好的方法可以使用Fluent NHibernate从一个数据库中复制出来并将其保存到另一个数据库中,还是需要查看其他选项?
我处理这些的正常循环是:
IList<Entities.Access.Revision> result;
IList<int> recordIds = aSession.Query<Entities.Access.Revision>().Select(x => x.Id).ToList<int>();
foreach (int recordId in recordIds)
{
result = aSession.Query<Entities.Access.Revision>().Where(x => x.Id == recordId).ToList<Entities.Access.Revision>();
Save(sqlDb, result);
}
Run Code Online (Sandbox Code Playgroud)
保存功能只是将属性从一个复制到另一个,并且对于某些实体用于操纵数据或向用户提供与数据问题相关的反馈.我正在为两个数据库使用无状态会话.
-
通过进一步测试,它似乎挂在上面的物体大约是60-70mb.我目前正在测试使用GetBytes使用OleDbDataReader获取数据.
-
更新(11月24日):我还没有找到一种方法让它与NHibernate一起使用.我确实使用常规db命令对象.我把以下制作的函数的代码放在任何好奇的人身上.这是我的数据库转换器中的代码,因此前缀为"a"的对象是访问数据库对象,而"s"是sql版本.
public void MigrateBinaryField(int id, string tableName, string fieldName)
{
var aCmd = new OleDbCommand(String.Format(@"SELECT ID, {0} FROM {1} WHERE ID = {2}", …Run Code Online (Sandbox Code Playgroud) 如何使用NHibernate Mapping或Fluent NHibernate创建多列索引和/或唯一约束.
我挖掘了很多关于DDD方法(无处不在的语言,聚合,存储库等)的东西,我认为,与我经常阅读的内容相反,实体应该有行为而不是不可知.我看到的所有示例都倾向于使用虚拟自动属性和空构造函数(受保护或最差,公共)呈现实体,就是这样.我认为这种对象更像是DTO然后是实体.
我正在使用其特定的API 创建框架,我不想被绑定到ORM.所以我首先构建了域(不考虑持久性),现在我想使用NHibernate作为持久性工具,所以我在当前的解决方案中添加了一个新项目,以帮助确保我的模型不会被改变以支持NHibernate.该项目应该是我域内的抽象存储库的实现.现在困难出现了.
因为这是我第一次使用NHibernate(我也尝试Fluent Nhibernate,但似乎更加限制)我想知道:
请记住,我正在构建一个框架,因此开放/封闭原则对我来说非常重要.
PS:对不起,如果我的英语不好,我来自蒙特利尔,我说法语.
编辑1:这是我现在对NHibernate的一个问题 - 如何使用Nhibernate(和Fluent NHibernate)映射Type
nhibernate frameworks domain-driven-design fluent-nhibernate
我有一个名为Salutation的Enum数据访问类:
public enum Salutation
{
Unknown = 0,
Dame = 1,
etc
Mr = 5,
etc
}
Run Code Online (Sandbox Code Playgroud)
我正在使用NHibernate进行课程,直到今天早上我才使用.hbm.xml文件进行映射.但是,我现在已经切换到使用Fluent NHibernate,但加载类的实例失败(例如):
[HibernateException:无法解析5作为称呼]
正如您所看到的,5应该可以解析为Salutation(假设5是一个int,它不可能从错误消息中得知).
谁知道这里发生了什么?
谢谢
大卫
对于大多数查询,我有我的nHibernate设置并且正确使用QueryOver,但是,每当我尝试执行HQL CreateQuery时,我都会得到实例未映射的异常.我可以使用QueryOver确认相同的实体正常工作.
注意:我使用流利的nHibernate
任何想法会导致什么?
我正在构建一个使用Controllers和ApiControllers的MVC4应用程序.我修改了默认Web API路由以包含操作名称.当我尝试获取基准列表时,我收到此错误消息:
'ObjectContent`1'类型无法序列化内容类型'application/json的响应主体; 字符集= UTF-8'
InnerException就是这个(我在这种情况下返回JSON,与XML相同):
"InnerException": {
"Message": "An error has occurred.",
"ExceptionMessage": "Error getting value from 'IdentityEqualityComparer' on 'NHibernate.Proxy.DefaultLazyInitializer'.",
"ExceptionType": "Newtonsoft.Json.JsonSerializationException",
"StackTrace": " at Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeISerializable(JsonWriter writer, ISerializable value, JsonISerializableContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty) …Run Code Online (Sandbox Code Playgroud) 我已经阅读了很多关于同样错误的问题,但没有找到与我的确切问题相符的问题.我正在尝试使用Fluent NHibernate访问对象的属性,它本身是根对象的一部分.一些答案说我需要使用投影,其他我需要使用连接,我认为它应该通过延迟加载.
这是我的两个类以及Fluent映射:
艺术家班
public class Artist
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<Album> Albums { get; set; }
public virtual string MusicBrainzId { get; set; }
public virtual string TheAudioDbId { get; set; }
public Artist() { }
}
public class ArtistMap : ClassMap<Artist>
{
public ArtistMap()
{
LazyLoad();
Id(a => a.Id);
Map(a => a.Name).Index("Name");
HasMany(a => a.Albums)
.Cascade.All();
Map(a => a.MusicBrainzId);
Map(a => a.TheAudioDbId);
} …Run Code Online (Sandbox Code Playgroud) nhibernate ×5
c# ×3
.net ×1
asp.net ×1
enums ×1
frameworks ×1
many-to-many ×1
mapping ×1
migration ×1
multi-tenant ×1
queryover ×1
rest ×1
sql-server ×1