休眠。符合。在联结表中设置复合主键

Posted

技术标签:

【中文标题】休眠。符合。在联结表中设置复合主键【英文标题】:NHibernate. Conform. Set composite primary key in junctiontable 【发布时间】:2012-12-05 08:31:09 【问题描述】:

我有两张表,我想创建一个联结表。我有这个映射。

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";

【问题讨论】:

什么意思:“但是没有设置为主键,复合键 ProjectId , UserId”? 我编辑回答你的问题。 还有什么问题? 您在此处显示的创建表脚本不是由 NHibernate 创建的。它很可能是一个手写的 SQL 脚本。 是的,当然不是。上面的代码是这样做的:如果存在“UsersInProject”级联,则删除表;创建表“UsersInProject”(“ProjectId”uuid 不为空,“UserId”uuid 不为空);更改表“UsersInProject”添加约束 FK28998796DB607AA2 外键(“UserId”)引用“用户”;更改表“UsersInProject”添加约束 FK28998796F9A8D344 外键(“ProjectId”)引用“Projects”; 【参考方案1】:

我得出的结论是,为了在 nHibernate 中拥有复合主键,您必须使用另一列用于 nHibernate 更新数据库中的行。

这里有更多内容: http://devlicio.us/blogs/anne_epstein/archive/2009/11/20/nhibernate-and-composite-keys.aspx

我相信,正因为如此,您必须在联结表中添加更多列(精确到 1 列)才能实现我想要的。

享受吧!

【讨论】:

以上是关于休眠。符合。在联结表中设置复合主键的主要内容,如果未能解决你的问题,请参考以下文章

使用复合主键在联结表上设置外键约束

在联结表中,如果我需要一个单一的唯一标识符和一个单独的唯一复合标识符,它应该是主键?

休眠仅保存具有复合主键中的父外键的子表条目

Hibernate:复合主键 - 外键:如何在两个表之间映射各个字段

休眠 - 使用包含父 ID 的复合键 - OneToMany

mySql 外键名问题