【问题标题】:Linq2Sql: Can I create entities with foreign key relationships without a primary key in both tables?Linq2Sql:我可以在两个表中都没有主键的情况下创建具有外键关系的实体吗?
【发布时间】:2009-06-13 21:17:49
【问题描述】:

我的数据库中有 2 个表,我正在尝试为其创建 Linq2Sql 实体。他们的意义远不止于此,但这基本上就是他们归结为:

房间用户活动 -------- -------- RoomID 活动ID RoomID(Rooms.RoomID 上的外键)

UserActivity 表本质上只是用户对 Rooms 表执行的操作的日志。

由于UserActivity 表仅用于记录所采取的操作,因此最初为表创建主键并没有多大意义(至少对我而言),直到 Linq2Sql 映射器拒绝创建 @ 987654323@ 我的 Linq 实体中 Room 实体的一部分。当我在 Visual Studio 设计器中设置实体时,我收到了以下 2 个警告:

  • 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 在我的实体之间创建关系,而无需在两个表中都有主键。如果UserActivity 表中没有主键,仍然可以创建实体,但不会生成关系。

是否可以这样做,或者我应该尝试确保我的表中始终有一个主键作为一般的良好做法?

【问题讨论】:

    标签: linq linq-to-sql


    【解决方案1】:

    在您的应用程序中存储真实数据的任何表都应该始终有一个主键 - 大多数情况下,在 SQL Server 环境中,INT IDENTITY(1,1) 就可以了。您不必跟踪这些,不需要记账等。它不会花费您太多,完全容易做到 - 我看不出有任何理由没有主键,即使在您的 UserActivity 表上.

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

    你就完成了!

    我唯一会说不需要主键的情况是批量导入大量数据时的临时表或其他临时场景。

    马克

    【讨论】:

      【解决方案2】:

      您需要一个主键来创建关系。 始终使用主键设计表是一种很好的做法,即使您添加了代理项(自动递增标识)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-12
        • 1970-01-01
        • 2020-10-03
        相关资源
        最近更新 更多