代码之家  ›  专栏  ›  技术社区  ›  Dan Herbert

linq2sql:我可以创建具有外键关系的实体,而这两个表中都没有主键吗?

  •  4
  • Dan Herbert  · 技术社区  · 15 年前

    我的数据库中有两个表,我正试图为其创建Linq2SQL实体。对他们来说,还有更多,但这基本上是他们的归宿:

    Rooms          UserActivity
    --------       --------
    RoomID         ActivityID 
                   RoomID (foreign key on Rooms.RoomID)
    

    这个 UserActivity 表本质上只是用户对房间表执行的操作的日志。

    自从 用户活动 表只用于记录所采取的操作,最初为表创建主键(至少对我来说)没有多大意义,直到linq2sql映射器拒绝 用户活动 一部分 Room 我的Linq实体中的实体。在Visual Studio设计器中设置实体时,收到以下两个警告:

    • Warning 1 DBML1062: The Type attribute 'UserActivity' of the Association element 'Room_UserActivity' of the Type element 'Room' does not have a primary key. No code will be generated for the association.
    • Warning 2 DBML1011: The Type element 'UserActivity' contains the Association element 'Room_UserActivity' but does not have a primary key. No code will be generated for the association.

    这些警告让我创建了 ActivityID 我的表中的列,如上面所示。

    我想知道的是,是否有任何方法允许Linq2SQL在两个表中都没有主键的情况下在实体之间创建关系。如果我在 用户活动 表中,仍然可以创建实体,但不会生成关系。

    是否可以这样做,或者我应该尝试确保我的表中始终有主键,这是一种常规的良好实践?

    2 回复  |  直到 15 年前
        1
  •  3
  •   marc_s    15 年前

    任何在应用程序中存储实际数据的表都应该始终具有主键——在大多数情况下,在SQL Server环境中,int标识(1,1)都可以。你不必跟踪这些,不需要记账等。这不会花费你太多,完全很容易做-我看不出任何理由为什么没有主密钥,即使在你的 UserActivity 表。

    ALTER TABLE UserActivity
      ADD UserActivityID INT IDENTITY(1,1) 
      CONSTRAINT PK_UserActivity PRIMARY KEY
    

    你完了!

    唯一一次我会说不需要主键的时候就是批量导入大量数据或其他临时方案时的临时表。

    马克

        2
  •  1
  •   Stuart    15 年前

    您需要一个主键来创建关系。 总是用主键设计表是一个很好的实践,即使添加了代理(自动增量标识)。