如何使用NHibernate Mapping或Fluent NHibernate创建多列索引和/或唯一约束.
我想知道是否有任何相对简单的方法来扩展NHibernate以支持F#的歧视联盟.不仅仅是单个IUserType或ICompositeUserType,而是一些通用的东西,无论DU的实际内容如何,我都可以重复使用.
例如,假设我有一个名为RequestInfo的属性,它是一个定义为的联合:
type RequestInfo =
| Id of int
| Name of string
Run Code Online (Sandbox Code Playgroud)
这将编译为一个抽象的RequestInfo类,具有具体的子类Id和Name.我可以通过F#反射得到所有这些信息.在这种情况下,我可以使用"RequestInfo_Tag","RequestInfo_Id","RequestInfo_Name"将其存储在数据库中.
因为我是NHibernate的新手,我会遇到什么样的问题试图遵循这种方法?更复杂的案件是不可能处理的?例如,嵌套的歧视联盟呢?有没有办法可以将其他联盟的读取"移交"到另一个ICompositeUserType?
更重要的是,这会搞砸我的查询功能吗?意思是,我是否必须知道DB中的实际列名; 我将无法执行Criteria.Eq(SomeDiscUnion)并将其全部整理出来?
我不是在寻找一个完整的"提供代码"的答案,只是一些一般的建议,如果这是值得追求的(以及如何),或者我应该重新考虑我的模型.
谢谢!
PS不要太粗鲁,但如果你的答案是"使用C#",那就不是很有帮助了.
我正在尝试利用NH来映射到数据模型,这是对EAV/CR数据模型的宽松解释.
我有大部分工作,但我正在努力映射Entity.Attributes集合.
以下是有问题的表格:
--------------------
| Entities |
--------------------
| EntityId PK |-|
| EntityType | |
-------------------- |
-------------
|
V
--------------------
| EntityAttributes | ------------------ ---------------------------
-------------------- | Attributes | | StringAttributes |
| EntityId PK,FK | ------------------ ---------------------------
| AttributeId FK | -> | AttributeId PK | -> | StringAttributeId PK,FK |
| AttributeValue | | AttributeType | | AttributeName |
-------------------- ------------------ ---------------------------
Run Code Online (Sandbox Code Playgroud)
AttributeValue列实现为sql_variant列,我为它实现了NHibernate.UserTypes.IUserType.
我可以创建一个EntityAttribute实体并直接保存它,以便部分层次结构正常工作.
我只是不确定如何将EntityAttributes集合映射到Entity实体.
请注意,EntityAttributes表可以(并且确实)包含给定EntityId/AttributeId组合的多个行:
EntityId AttributeId AttributeValue
-------- ----------- --------------
1 1 Blue
1 …Run Code Online (Sandbox Code Playgroud) 我有一个名为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配置/映射移动到代码中以帮助解决一些维护问题.任何人都可以提供Fluent NHibernate与NHibernate.Mapping.Attributes的任何建议/优缺点/比较吗?
我对Java Hibernate注释有一些经验,我很喜欢,但我很好奇NHibernate属性是否具有可比性,以及Fluent是否提供了应该考虑的任何重大上行/下行.
如何在源代码大小为varbinary(max)的sql server 2005表中创建一个varbinary字段,以获得流畅的nhibernate?目前我总是得到varbinary(8000)的默认值,这不够大,因为我将存储图像文件.
我尝试过使用CAstle.ActiveRecord但尚未取得任何成功.
[ActiveRecord]
public class MyFile : Entity
{
public virtual string FileName { get; set; }
public virtual string FileType { get; set; }
public virtual int FileVersion { get; set; }
public virtual int FileLength { get; set; }
[Property(ColumnType = "BinaryBlob", SqlType = "VARBINARY(MAX)")]
public virtual byte[] FileData { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
几个小时都未能找到解决方案,所以提前谢谢
捷克克朗
是否可以使用Fluent Nhibernate将枚举映射为字符串?
我有两个双向一对多关系的实体:
public class Storage
{
public IList<Box> Boxes { get; set; }
}
public class Box
{
public Storage CurrentStorage { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和映射:
<class name="Storage">
<bag name="Boxes" cascade="all-delete-orphan" inverse="true">
<key column="Storage_Id" />
<one-to-many class="Box" />
</bag>
</class>
<class name="Box">
<many-to-one name="CurrentStorage" column="Storage_Id" />
</class>
Run Code Online (Sandbox Code Playgroud)
A Storage可以有很多Boxes,但Box只能属于一个Storage.我将它们映射,以便一对多有一个级联all-delete-orphan.
当我尝试更换Box时,我的问题就出现了Storage.假设我已经运行了这段代码:
var storage1 = new Storage();
var storage2 = new Storage();
storage1.Boxes.Add(new Box());
Session.Create(storage1);
Session.Create(storage2);
Run Code Online (Sandbox Code Playgroud)
以下代码将给我一个例外:
// get the first …Run Code Online (Sandbox Code Playgroud) 我有这样的映射:
HasMany(x => x.Orders).KeyColumn("CustomerID");
Run Code Online (Sandbox Code Playgroud)
这导致schemaexport生成这样的约束:
alter table [CustomerOrder]
add constraint FK45B3FB85AF01218D
foreign key (CustomerID)
references [Customer]
Run Code Online (Sandbox Code Playgroud)
我尝试在References()映射上添加.NotFound.Ignore(),以禁止生成约束,但这不起作用.
是否可以定义一个映射来强制SchemaExport不生成约束?
nhibernate nhibernate-mapping fluent-nhibernate schemaexport
班级:
public class SOPProcess : ISOPProcess
{
public virtual Guid Id { get; set; }
public virtual SOP SOP { get; set; }
public virtual ProcessType Type { get; set; }
public virtual SOPProcessInput Input { get; set; }
public virtual SOPProcessOutput Output { get; set; }
public virtual SOPProcessMeasures Measures { get; set; }
public virtual decimal YieldFactor { get; set; }
public virtual SOPProcess PreviousProcess { get; set; }
public virtual SOPProcess NextProcess { get; set; }
} …Run Code Online (Sandbox Code Playgroud)