NHibernate: Почему дочерние объекты в коллекции не сохраняются?C#

Место общения программистов C#
Ответить
Anonymous
 NHibernate: Почему дочерние объекты в коллекции не сохраняются?

Сообщение Anonymous »

Я использую:
  • .NET Core SDK (соответствует любому файлу global.json): версия 2.2.300; Зафиксировать: 73efd5bd87
  • NHibernate 5.2.5
У меня есть следующие объекты:

Код: Выделить всё

public class Customer : Entity {
public Customer() {
Initialize();
}
public virtual string Name { get; set; }
public virtual string LegalName { get; set; }
public virtual string VATCode { get; set; }
public virtual ICollection Sites { get; set; }
public virtual DateTime Created { get; set; } = DateTime.UtcNow;

private void Initialize() {
Sites = new List();
}
}

public class Site : Entity {
public virtual string Address { get; set; }
public virtual string City { get; set; }
public virtual string Country { get; set; }
public virtual Customer Customer { get; set; }
}
со следующими картографами

Код: Выделить всё

internal class CustomerConfiguration : ClassMapping {
public CustomerConfiguration() {
Table( TableNames.CustomersTable );

Id( x => x.EntityID, im => {
im.Column( "CustomerID" );
im.Generator( Generators.Identity );
} );
[... code omitted for brevity ...]
Set( property => property.Sites,
collection => {
collection.Fetch( CollectionFetchMode.Join );
collection.Lazy( CollectionLazy.Lazy );
collection.Cascade( Cascade.Persist.Include( Cascade.DeleteOrphans ) );
collection.Inverse( true );
collection.Key( keyMapping => {
keyMapping.Column( "CustomerID" );
} );
},
mapping => {
mapping.OneToMany( relationalMapping => {
relationalMapping.Class( typeof( Site ) );
} );
} );
}
}

internal class SiteConfiguration : ClassMapping {
public SiteConfiguration() {
Table( TableNames.SitesTable );

Id( x => x.EntityID, im => {
im.Column( "SiteID" );
im.Generator( Generators.Identity );
} );
[... code omitted for brevity ...]
ManyToOne( x => x.Customer, mm => {
mm.Column( "CustomerID" );
mm.NotNullable( true );
} );
}
}
Думаю, это сопоставление неверно, потому что если я сделаю что-то вроде

Код: Выделить всё

using ( var session = sessionFactory.OpenSession() ) {
var customer = new Customer() {
Name = $"Customer 1",
LegalName = $"Customer 1 LLC",
VATCode = "xxxxxxxxx",
Created = DateTime.UtcNow
};
customer.Sites.Add( new Site() {
Address = $"Address Customer 1",
City = $"City Customer 1",
Country = $"Country Customer 1",
Customer = customer
} );
session.Save( customer );
}
Я получаю следующее исключение

Необработанное исключение: NHibernate.TransientObjectException: объект ссылается на несохраненный временный экземпляр — сохраните временный экземпляр перед очисткой или установите для свойства каскадное действие, которое приведет к его автосохранению. Тип: Nhibernate.ConsoleApp.Entities.Site, Entity: [Сайт 0]

Есть предложения?
РЕДАКТИРОВАТЬ
На самом деле проблема была в другой области. это произошло из-за наличия двух зарегистрированных Слушателей (

Код: Выделить всё

IDeleteEventListener
и IUpdateEventListener). Всякий раз, когда я добавляю эти обновления и удаление, не работает. Однако мне удалось обнаружить проблему благодаря комментарию Романа Артюхина

Подробнее здесь: https://stackoverflow.com/questions/569 ... eing-saved
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»