NHibernate. Соответствуют. Установить составной первичный ключ в соединительной

У меня есть две таблицы, и я палочка, чтобы создать соединительную таблицу. У меня есть это отображение.

public UsertMap()
    {
        Table("Users");
        Id(x => x.Id, map => map.Generator(Generators.Assigned));
        Property(x => x.FirstName, map => map.NotNullable(true));
        Property(x => x.LastName, map => map.NotNullable(true));
        Property(x => x.Role, map => map.NotNullable(true));
        Bag(x => x.Projects, map =>
        {
            map.Table("UsersInProject");
            map.Cascade(Cascade.None);
            map.Access(Accessor.Field);
            map.Key(u => u.Column("UserId")); 
            }, a => a.ManyToMany(x => x.Column("ProjectId")));
    }

а также

public ProjectMap()
    {
        Table("Projects");
        Id(x => x.Id, map => map.Generator(Generators.Assigned));
        Property(x => x.SubmissionDate, map =>map.NotNullable(true));
        Property(x => x.QuotesubmissionDate, map => map.NotNullable(true));
        Bag(x => x.ProjectUsers, map =>
        {
            map.Table("UsersInProject");
            map.Cascade(Cascade.None);
            map.Access(Accessor.Field);
            map.Key(u => u.Column("ProjectId"));
        }, a => a.ManyToMany(x => x.Column("UserId")));
    }

Он создал таблицу соединений, но без указания в качестве первичного ключа * составного ключа {ProjectId, UserId}

Что я делаю неправильно?

Спасибо заранее.

* Мне было странно понимать это, когда мне рассказывали об этом коде. Созданная таблица создается с помощью этого кода SQL:

CREATE TABLE "UsersInProject"
(
  "ProjectId" uuid NOT NULL,
  "UserId" uuid NOT NULL,
  CONSTRAINT fk28998796db607aa2 FOREIGN KEY ("UserId")
      REFERENCES "Users" ("Id") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fk28998796f9a8d344 FOREIGN KEY ("ProjectId")
      REFERENCES "Projects" ("Id") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
  OIDS=FALSE
);
ALTER TABLE "UsersInProject"
  OWNER TO test;

Я бы также упомянул следующую строку:

CONSTRAINT pk PRIMARY KEY ("ProjectId" , "UserId" ),

edit2: (для лучшего просмотра)

drop table if exists "UsersInProject" cascade;
create table "UsersInProject" (
        "ProjectId" uuid not null,
       "UserId" uuid not null
    );
    alter table "UsersInProject" 
        add constraint FK28998796DB607AA2 
        foreign key ("UserId") 
        references "Users";

    alter table "UsersInProject" 
        add constraint FK28998796F9A8D344 
        foreign key ("ProjectId") 
        references "Projects";

1 ответ

Решение

Я пришел к выводу, что для того, чтобы иметь составной первичный ключ в nHibernate, вам придется использовать другой столбец, который будет использоваться для обновления строки в базе данных с помощью nHibernate.

Подробнее об этом здесь: http://devlicio.us/blogs/anne_epstein/archive/2009/11/20/nhibernate-and-composite-keys.aspx

Я считаю, что из-за этого вы должны добавить больше столбцов (1 столбец, чтобы быть точным) в соединительной таблице, чтобы достичь того, что я хотел.

Наслаждайтесь!

Другие вопросы по тегам