Свободно-Нибернатный вопрос отношений многих ко многим - PullRequest
0 голосов
/ 04 августа 2010

Я столкнулся с проблемой при попытке удалить отношение многие ко многим с помощью Fluent Nhibernate. У меня есть следующие классы домена:

public class Organisation
{
   public virtual int Id {get; set;}

   private IList<OrganisationRelationshiop> relatedOrganisations; 

   public virtual IList<OrganisationRelationship> RelatedOrganisation
   {
       get
       {
           return this.relatedOrganisations;
       }

      protected set
      {
           this.relatedOrganisations = value;
      }
    }


    public virtual void RemoveRelatedOrganisation(OrganisationRelationship organisationRelationship)
    {
        this.relatedOrganisations.Remove(organisationRelationship);
    }

}

Вот мой класс OrganisationRelationship, представляющий отношения «многие ко многим» между организациями.

   public class OrganisationRelationship 
   {
       public virtual int Id {get; set;}

       public virtual Organisation Organisation{ get; set; }

       public virtual OrganisationRelationshipType OrganisationRelationshipType { get; set; }

       public virtual Organisation RelatedOrganisation { get; set; }
   }

Это сценарий для таблиц:

Организационный стол:

CREATE TABLE [dbo].[Organisation](
[Id] [int] IDENTITY(1,1) NOT NULL,
[OrganisationName] [nvarchar](200) NOT NULL,
CONSTRAINT [PK_Organisation] PRIMARY KEY CLUSTERED 
(
[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,    ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

Таблица связей организации:

CREATE TABLE [dbo].[OrganisationRelationship](
[Id] [int] IDENTITY(1,1) NOT NULL,
[OrganisationId] [int] NOT NULL,
[RelatedOrganisationId] [int] NOT NULL,
[OrganisationRelationshipTypeId] [int] NOT NULL,
CONSTRAINT [PK_OrganisationRelationship] PRIMARY KEY CLUSTERED 
(
[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,        ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

Таблица OrganisationRelationType:

CREATE TABLE [dbo].[OrganisationRelationshipType](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_OrganisationRelationshipType] PRIMARY KEY CLUSTERED 
(
[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,    ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

Все работает, как я ожидаю, но когда я пытаюсь удалить отношение, свободный Nhibernate пытается установить для CompanyId значение NULL для этой конкретной записи вместо удаления записи из таблицы CompanyRelationship. Вот запрос, который я вижу в NHProf:

UPDATE CompanyRelationship
SET    CompanyId = null
WHERE  CompanyId = 3893 /* @p0 */
AND Id = 487 /* @p1 */

Чтобы удалить запись, я вызываю функцию RemoveRelatedCompany, которая удаляет конкретную CompanyRelationship из списка relatedCompanies, а затем я вызываю Session.Save () и Session.Flush (), чтобы сохранить сущность Company.

Есть идеи относительно того, что я делаю здесь неправильно, из-за чего это поведение?

Ответы [ 2 ]

1 голос
/ 04 августа 2010

Поскольку я использую AutoMapping, мне пришлось переопределить сопоставления для Организации следующим образом, чтобы решить проблему:

mapping.HasMany (c => c.RelatedOrganisations) .Inverse (). ForeignKeyCascadeOnDelete ().Таблица ( "OrganisationRelationship");

0 голосов
/ 04 августа 2010

Возможно, вы должны установить .Cascade.AllDeleteOrphan ();(cascade = «all-delete-orphan») на ваших сопоставлениях.

Также, если вы разместите свои сопоставления, вам будет проще ответить

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