标签: nhibernate-mapping

在NHibernate中查询未映射的列

我有一个使用NHibernate映射到表的类.问题是只有部分属性映射到表中的列.这很好,因为我们用于显示的唯一列是映射的,但我想知道是否有任何方法可以查询表中未映射到我的类中的属性的其他列.

例如,我们有一个包含以下列的表:

Customer
-----------
CustomerId
Name
DateCreated
Run Code Online (Sandbox Code Playgroud)

我们有一个对象

public class Customer
{
    public virtual int CustomerId {get;set;}
    public virtual string name {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

namecustomerId被映射但DateCreated不是因为我们从来没有在任何地方显示出来.我们想查询Customer表格,了解特定日期创建的客户.如果没有映射,有没有办法做到这一点DateCreated?此外,最好使用标准API执行此操作.

c# nhibernate nhibernate-mapping

8
推荐指数
3
解决办法
7149
查看次数

如何在Hibernate中映射一组枚举类型?

在hibernate中,是否可以将类的映射定义为一组枚举?

我已经能够找到如何定义集合映射的示例,我已经能够找到有关如何映射枚举的单独示例,但我无法弄清楚如何为类定义枚举.

有谁能请我提供一个例子?

这是在现有应用程序之上构建的,因此我无法更改数据库架构.

这是我希望建模的关系.Wicket是一个普通的类,WicketType是一个Java Enum.

+----------------+    +------------+    +------------+
| Wicket         |    | Ref Table  |    | WicketType |
+----------------+    +------------+    +------------+
| INT     | W_ID |    |            |    | W_TypeId   |
| ....    |      | FK | W_ID       | FK | WicketType |
| INT     | TYPE |----| W_TypeId   |----|            |
+----------------+    +------------+    +------------+
Run Code Online (Sandbox Code Playgroud)

再次感谢

java orm hibernate nhibernate-mapping

8
推荐指数
1
解决办法
2万
查看次数

在NHibernate中定义多对多关系以允许删除但避免重复记录的正确方法是什么

我已经用NHibernate设置了几天,但是我无法找出正确的方法来设置我的映射,所以它的工作方式就像我期望的那样.

在我遇到问题之前需要经过一些代码,所以请提前道歉以获得额外的阅读.

目前的设置非常简单,只有这些表:

类别
CategoryId
名称

Item
ItemId
名称

ItemCategory
ItemId
CategoryId

一个项目可以在许多类别中,每个类别可以有许多项目(简单的多对多关系).

我的映射设置如下:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="..."
                   namespace="...">

  <class name="Category" lazy="true">

    <id name="CategoryId" unsaved-value="0">
      <generator class="native" />
    </id>
    <property name="Name" />

    <bag name="Items" table="ItemCategory" cascade="save-update" inverse="true" generic="true">
      <key column="CategoryId"></key>
      <many-to-many class="Item" column="ItemId"></many-to-many>
    </bag>

  </class>

</hibernate-mapping>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="..."
                   namespace="...">

  <class name="Item" table="Item" lazy="true">

    <id name="ItemId" unsaved-value="0">
      <generator class="native" />
    </id>
    <property name="Name" />

    <bag name="Categories" table="ItemCategory" cascade="save-update" generic="true">
      <key column="ItemId"></key>
      <many-to-many class="Category" column="CategoryId"></many-to-many>
    </bag>

  </class>

</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)

我在物品的类别和类别列表中的项目列表中添加项目的方法设置了关系的两侧.

项目中: …

nhibernate many-to-many nhibernate-mapping

8
推荐指数
1
解决办法
7082
查看次数

将一个建模为零或一个关系(Z基数)

我正在努力寻找模拟1:0,1关系("可能有一个"或"最多只有一个")的最佳方式.我相信这被称为Z基数.

例如,假设我有两个类WidgetWidgetTest.并非所有小部件都经过测试且测试具有破坏性,因此每个小部件最多只能有一个WidgetTest.还假设将WidgetTest字段添加到Widget是不合适的.

我希望我的公共界面是:

Widget
    WidgetTest { get; set; }

WidgetTest
    Widget { get; }
Run Code Online (Sandbox Code Playgroud)

模型1:Widget具有WidgetTest属性,并且在数据库中Widget表具有WidgetTest的唯一约束外键.我的DBA辩称,这将允许WidgetTest记录在没有Widget的情况下存在.

WidgetTable
    WidgetTestId (FK, UQ)
Run Code Online (Sandbox Code Playgroud)

模型2:Widget具有WidgetTest的私有集合,并通过在公共WidgetTest属性控制的集合中添加或删除单个对象来强制执行0,1关系.数据库将此模型设置为1:m,WidgetTest具有对Widget唯一约束的外键.我认为这意味着采用该模型来适应数据库模式(即为我做更多的工作).

WidgetTestTable
    WidgetId (FK, UQ)
Run Code Online (Sandbox Code Playgroud)

哪种型号更好?使用NHibernate更容易实现哪些?还是有第三种方式?

编辑......这是我最终得到的结果:

public class Widget
{
    // This is mapped in NH using a access strategy
    private IList<WidgetTest> _widgetTests = new List<WidgetTest>(1);

    public WidgetTest
    {
        get { return _widgetTests.FirstOrDefault(); }
        set
        {
            _widgetTests.Clear();
            if (value != null)
            {
                _widgetTests.Add(value);
            }
         }
     }
}
Run Code Online (Sandbox Code Playgroud)

oop nhibernate nhibernate-mapping

8
推荐指数
1
解决办法
1494
查看次数

HasOne vs References Mapping Fluent NHibernate

这是我第一次使用FluentNhibernate Mapping并面临如何引用另一个表的问题.任何帮助表示赞赏:

我有几个名为CD_ varname的表,所有这些包含两列 - CODE和DESCR.

我有一个名为Recipient的主表,它有两列,称为ALIVE和SEX,两者都是类型号,它们引用表CD_ALIVE和CD_SEX.如果收件人中的Alive = 1,那么我们需要从CD_ALIVE表中获取代码和descr,其中Code = 1.

我已经描述了一个Codef类:

public Class Codef
{
    int Code { get; set; }
    string Descr { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的收件人类将这些分配给组件.收件人类看起来像这样:

 public Class IRecepient
{
    int ID { get; set; }
    Birth Birth {get; set;}
    Death Death { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的出生和死亡课程是:

public Class Birth
{
    DateTime BDate { get; set; }
    Codef Sex { get; set; }
    Codef Ethnicity { get; set; } //CD_ETHNICITy Table …
Run Code Online (Sandbox Code Playgroud)

nhibernate nhibernate-mapping fluent-nhibernate

8
推荐指数
1
解决办法
2万
查看次数

NHibernate中的多对多映射

我希望使用NHibernate创建多对多的关系.我不确定如何在XML文件中映射这些.我还没有创建类,但它们只是基本的POCO.


PERSONID

能力
胜任
标题

Person_x_Competency
personId
competencyId

我是否会在每个POCO中为另一个类创建一个List?然后使用NHibernate配置文件以某种方式映射它们?

nhibernate many-to-many nhibernate-mapping xml-configuration

8
推荐指数
1
解决办法
1万
查看次数

Nhibernate - item将其ParentID更新为null而不是删除

流程中的业务逻辑是:

  • 开始交易
  • 将项添加到集合中
  • 执行查找("somethingA")
  • 删除该项目取决于上一步骤.
  • 提交事务

即时通讯使用级联全删除,孤儿,和逆=真正的,无论是在我的父类.从集合中删除项目时,我设置.parentObj = null并从集合中删除该项目.

使用时TemplateFlushMode.Auto,我分析了数据库,并完成以下操作:

  • INSERT项目
  • SELECT相关的tosomethingA
  • 将Item的parentID(父级的FK)更新为NULL

(插入项目已完成,因为find()已完成,以保证数据库中的数据一致性).完成选择,然后我希望DELETE执行...但是更新parentID = null完成.

在执行Session.Flush()权限之前Find(),会发生以下情况:

  • INSERT项目
  • SELECT相关的tosomethingA
  • 删除项目

使用时TemplateFlushMode.Commit,更改将在事务结束时完成,并且永远不会插入项目:

  • SELECT相关的tosomethingA

我正在使用的应用程序正在使用TemplateFlushMode.Auto,所以我想知道,是否有一个解释为什么如果在一个项目之间添加一个选项并在同一个事务中删除之后,级联不起作用?

我知道第一个回答是"不要在集合中添加项目,如果之后将删除".但我宁愿不改变业务逻辑.

有谁知道为什么要进行更新而不是delete使用时AUTO?(使用Commit时不插入对象)

c# nhibernate nhibernate-mapping

8
推荐指数
1
解决办法
319
查看次数

流畅的NHibernate一对多映射

我有以下两个班级:

广告

public virtual int Id { get; set;
public virtual IList<AdvertImage> AdvertImages { get; set; }
Run Code Online (Sandbox Code Playgroud)

AdvertImage

public virtual int Id { get; set; }
public virtual string Filename { get; set;
public virtual Advert Advert { get; set; }
Run Code Online (Sandbox Code Playgroud)

在数据库中,我的AdvertImages表具有FK'AdvertId',它与具有'Id'PK的广告表相关.

这是一对多映射,因为一个广告可以有许多图像.

我的Fluent NHibernate映射(为简洁起见编辑)是:

AdvertMap

Id(x => x.Id)
  .GeneratedBy.Identity();
...
HasMany(x => x.AdvertImages)
  .KeyColumn("AdvertId")
  .Inverse();
...
Table("Adverts");
Run Code Online (Sandbox Code Playgroud)

AdvertImageMap

Id(x => x.Id)
  .GeneratedBy.Identity();
...
References(x => x.Advert)
  .Column("AdvertId");
...
Table("AdvertImages");
Run Code Online (Sandbox Code Playgroud)

我正在创建一个新的Advert代码实例,然后AdvertImages使用a 填充属性(广告)List<AdvertImage>.

当我将我的Advert …

nhibernate nhibernate-mapping fluent-nhibernate fluent-nhibernate-mapping

8
推荐指数
1
解决办法
1万
查看次数

使用NHibernate映射一对多的最小和正确方法

我是NHibernate和C#的新手,所以请保持温柔!

我有以下两个NHibernate实体:

Employee
{
    private long _id;
    private String _name;
    private String _empNumber;
    private IList<Address> _addresses;

    //Properties...
}
Run Code Online (Sandbox Code Playgroud)

Address
{
    private long _id;
    private String _addrLine1;
    private String _addrLine2;
    private String _city;
    private String _country;
    private String _postalCode;

    //Properties
}
Run Code Online (Sandbox Code Playgroud)

他们有一个one-to-many从关系EmployeeAddress (每个员工可以在自己的记录多个地址).方便地忽略多个员工可能居住在同一地址的事实.

我从内存中的对象(NHibernate实体)的角度理解这一点.我正在努力的是映射文件(我在这里举一个简单的例子).这是我到目前为止所提出的:

// Intentionally left out XML and <hibernate-mapping> 
// Mappings for class 'Employee'. -->
<class name="Employee" table="Employees">
    <id name="ID">
        <generator class="native">
    </id>

    <property name="Name" />
    <property name="EmpNumber" />

    <bag name="Addresses">
        <key …
Run Code Online (Sandbox Code Playgroud)

c# nhibernate orm nhibernate-mapping

8
推荐指数
1
解决办法
2万
查看次数

无法从 nhibernate.driver.sqlclientdriver、nhibernate、version=5.3.0.0、culture=neutral、publickeytoken=aa95f207798dfdb4 创建驱动程序

我在 .net 6 项目中遇到以下错误 fluentNhibernate 但相同的代码在框架 4.8 中工作。

错误:无法从 nhibernate.driver.sqlclientdriver、nhibernate、version=5.3.0.0、culture=neutral、publickeytoken=aa95f207798dfdb4 创建驱动程序

我在 .net 6 中的代码是:

public class DatabaseContext
{
    private static ISessionFactory session;

    private static ISessionFactory CreateSession()
    {
        const string connectionString = "Data source=SQLEXPRESS;Database=**;Integrated Security=True";

        if (session != null)
        {
            return session;
        }
        var sqlConfiguration = MsSqlConfiguration.MsSql2012.ConnectionString(connectionString);

        return Fluently.Configure()
            .Database(sqlConfiguration)
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<TokenMapping>())
            .ExposeConfiguration(cfg => new SchemaExport(cfg).Execute(false, true, false))
            .BuildSessionFactory();
    }
    public static NHibernate.ISession SessionOpen()
    {
        return CreateSession().OpenSession();
    }
}
Run Code Online (Sandbox Code Playgroud)

c# nhibernate nhibernate-mapping fluent-nhibernate

8
推荐指数
1
解决办法
2897
查看次数