Linq2Sql:我可以在两个表中创建没有主键的外键关系的实体吗?

时间:2009-06-13 21:17:49

标签: linq linq-to-sql

我的数据库中有2个表,我正在尝试为其创建Linq2Sql实体。除此之外还有更多内容,但这基本上归结为:

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

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

由于UserActivity表仅用于记录所执行的操作,因此对于最初为表创建主键没有多大意义(至少对我而言),直到Linq2Sql映射器拒绝将UserActivity作为我的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表中没有主键,则仍然可以创建实体,但不会生成关系。

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

2 个答案:

答案 0 :(得分:3)

任何在应用程序中存储实际数据的表应始终具有主键 - 大多数情况下,在SQL Server环境中,INT IDENTITY(1,1)都可以。你不必跟踪那些,没有必要的簿记等。它不会花费你太多,完全容易做到 - 我没有看到任何理由为什么没有主键,即使你的{{1} } table。

UserActivity

你已经完成了!

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

马克

答案 1 :(得分:1)

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

相关问题