2012-10-22 4 views
1

Там в ResourcePackage класс и PackageItem класс:NHibernate: Не удалось удалить коллекцию: Невозможно вставить значение NULL

public ResourcePackageMap() 
{ 
    DiscriminatorValue((int)ResourceObjectType.Package); 

    HasMany(x => x.Children).KeyColumn("AggregationObjectId").Cascade.AllDeleteOrphan(); 
} 

public PackageItemMap() 
{ 
    Id(x => x.Id, "AggregationLinkId"); 
    References(x => x.ResourceItem, "ChildObjectId"); 
    References(x => x.Package, "AggregationObjectId"); 
    Map(x => x.Order, "OrderWithinAggregation"); 
    Map(x => x.Usage, "Usage"); 

    Table("tbl_Object_Aggregation_Link"); 
} 

Я получил сообщение об ошибке сказав:

 
could not delete collection: [Domain.ResourcePackage.Children#102c589b-fc1c-451d-8300-a0ef00baa21f][SQL: 
UPDATE tbl_Object_Aggregation_Link SET AggregationObjectId = null WHERE AggregationObjectId = @p0] 

NHibernate.Exceptions.GenericADOException: could not delete collection: 
[Domain.ResourcePackage.Children#102c589b-fc1c-451d-8300-a0ef00baa21f] 
[SQL: UPDATE tbl_Object_Aggregation_Link SET AggregationObjectId = null WHERE 
AggregationObjectId = @p0] ---> System.Data.SqlClient.SqlException: 
Cannot insert the value NULL into column 'AggregationObjectId', 
table 'KDatabase.dbo.tbl_Object_Aggregation_Link'; 
column does not allow nulls. 
UPDATE fails. The statement has been terminated. 

В таблице отношения работает как следовать :

Существует таблица tbl_Object и таблица tbl_Object_Aggregation_Link, которая содержит два внешних ключа к таблице tbl_Object.

А класс отображение tbl_Object_Aggregation_Link таблицы:

public class PackageItemMap : ClassMap<PackageItem> 
{ 
    public PackageItemMap() 
    { 
     Id(x => x.Id, "AggregationLinkId"); 
     References(x => x.ResourceItem, "ChildObjectId"); 
     References(x => x.Package, "AggregationObjectId"); 
     Map(x => x.Order, "OrderWithinAggregation"); 
     Map(x => x.Usage, "Usage"); 

     Table("tbl_Object_Aggregation_Link"); 
    } 
} 

ответ

0

Либо изменить

 HasMany(x => x.Children).KeyColumn("AggregationObjectId").Cascade.AllDeleteOrphan() 

в

 HasMany(x => x.Children).KeyColumn("AggregationObjectId").Cascade.All() 

Или сделать как внешние ключи в 'tbl_Object_Aggregation_Link' таблице принимать нулевое значения.

Edit (Другое решение):

судя по карте:

References(x => x.Package, "AggregationObjectId"); 

Я думаю, вы либо пропускание свойства (пакет) утратившая база данных не позволяют нуля для этого иностранного или идентификатор этого пакета не существует в базе данных. Так что либо сделать столбец "AggregationObjectId" принимает нулевое или передать действительный объект пакета (вы можете получить его с помощью NHibernate и передать его), или сделать карту, как это:

References(x => x.Package, "AggregationObjectId").Cascade.All(); 

, но это будет автоматически, если сохранить пакет его не удалось найти в базе данных.

+0

Привет, Ну, я пробовал Cascade.All(), и он все еще дает мне ту же ошибку. – user1764339

+0

Я снова отредактировал ответ, проверьте его. –

Смежные вопросы