gpt4 book ai didi

.net - NHibernate不坚持多对多关系

转载 作者:行者123 更新时间:2023-12-04 09:29:53 25 4
gpt4 key购买 nike

我目前使用NHibernate作为数据访问层,使用Fluent NHibernate为我创建映射文件。我有两个类TripItem和TripItemAttributeValue,它们之间具有多对多关系。

映射如下:

public class TripItemMap : ClassMap<TripItem2>
{
public TripItemMap()
{
WithTable("TripItemsInt");
NotLazyLoaded();

Id(x => x.ID).GeneratedBy.Identity().WithUnsavedValue(0);
Map(x => x.CreateDate, "CreatedOn").CanNotBeNull();
Map(x => x.ModifyDate, "LastModified").CanNotBeNull();

/* snip */

HasManyToMany<TripItemAttributeValue>(x => x.Attributes).AsBag()
.WithTableName("TripItems_TripItemAttributeValues_Link")
.WithParentKeyColumn("TripItemId")
.WithChildKeyColumn("TripItemAttributeValueId")
.LazyLoad();
}
}

public class TripItemAttributeValueMap : ClassMap<TripItemAttributeValue>
{
public TripItemAttributeValueMap()
{
WithTable("TripItemAttributeValues");

Id(x => x.Id).GeneratedBy.Identity();
Map(x => x.Name).CanNotBeNull();

HasManyToMany<TripItem2>(x => x.TripItems).AsBag()
.WithTableName("TripItems_TripItemAttributeValues_Link")
.WithParentKeyColumn("TripItemAttributeValueId")
.WithChildKeyColumn("TripItemId")
.LazyLoad();
}
}

在我的应用程序中的某个时候,我从数据库中获取现有属性,将它们添加到tripItem.Attributes,然后保存tripItem对象。最后,TripItems_TripItemAttributeValues_Link永远不会获得任何新记录,从而导致关系不持久。

如果有帮助,这些是Fluent NHibernate为这些类生成的映射文件:
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="true" assembly="ETP.Core" namespace="ETP.Core.Domain">
<class name="TripItem2" table="TripItemsInt" xmlns="urn:nhibernate-mapping-2.2" lazy="false">
<id name="ID" column="ID" type="Int32" unsaved-value="0">
<generator class="identity" />
</id>
<property name="CreateDate" column="CreatedOn" type="DateTime" not-null="true">
<column name="CreatedOn" />
</property>
<property name="ModifyDate" column="LastModified" type="DateTime" not-null="true">
<column name="LastModified" />
</property>
<bag name="Attributes" lazy="true" table="TripItems_TripItemAttributeValues_Link">
<key column="TripItemId" />
<many-to-many column="TripItemAttributeValueId" class="ETP.Core.Domain.TripItemAttributeValue, ETP.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bag>
</class>
</hibernate-mapping>


<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="true" assembly="ETP.Core" namespace="ETP.Core.Domain">
<class name="TripItemAttributeValue" table="TripItemAttributeValues" xmlns="urn:nhibernate-mapping-2.2">
<id name="Id" column="Id" type="Int32">
<generator class="identity" />
</id>
<property name="Name" column="Name" length="100" type="String" not-null="true">
<column name="Name" />
</property>
<bag name="TripItems" lazy="true" table="TripItems_TripItemAttributeValues_Link">
<key column="TripItemAttributeValueId" />
<many-to-many column="TripItemId" class="ETP.Core.Domain.TripItem2, ETP.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bag>
</class>
</hibernate-mapping>

我在这里做错了什么?

最佳答案

@efdee

我遇到了同样的问题,花了将近两天的时间。我有很多对很多的关系,链接表也没有更新。我是NHibernate的新手,只是想学习它,所以请一言以蔽之。

事实证明,它不是Fluent NHibernate,也不是映射,但是我不了解NHibernate如何与多对多协同工作。在多对多关系中,如果未填充两个实体上的集合,则NHibernate不会将数据持久化到链接表中。

假设我的实体之间存在多对多关系:


partial class Contact
{
public string ContactName {get; set;}
public IList Locations {get; set;}

}

partial class Location
{
public string LocationName {get; set;}
public string LocationAddress {get;set;}
public IList Contacts {get;set;}
}


当我将一个位置添加到Contact.Locations中时,必须确保该联系人也位于location.Contacts内部。

所以要添加位置,我的Contact类中有此方法。

public void AddLocation(Location location)
{
if (!location.Contacts.Contains(this))
{
location.Contacts.Add(this);
}
Locations.Add(location);
}

这似乎解决了我的问题,但是就像我说的那样,我只是学习NHibernate并学习它,也许有更好的方法了。如果有人有更好的解决方案,请发布。

这是让我检查两个集合的文章: http://www.coderanch.com/t/217138/Object-Relational-Mapping/link-table-of-ManyToMany-annotation

关于.net - NHibernate不坚持多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/400097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com