【问题标题】:MSSQL and Entity framework syncing PK on multiple tablesMSSQL 和实体框架在多个表上同步 PK
【发布时间】:2013-01-31 20:57:03
【问题描述】:

我一直在使用 C# 中的实体框架,试图弄清楚如何将两个表连接在一起。我在http://msdn.microsoft.com/en-us/data/jj715646.aspx 找到了有关如何执行此操作的参考。问题是,这两个表的 PK 不同步,这似乎是一个要求。我以前从来不用担心从数据库中的两个表同步 PK。我知道我可以在一张桌子上关闭身份插入,但我看到很多人的 cmets 认为这是一个非常糟糕的主意。如果我不应该这样做,那么如何完成每个表中的 PK 同步?

我在一个数据库中有两个表:

用户

  • pkID(整数)
  • 名字(varchar)
  • 姓氏(varchar)
  • 电子邮件(varchar)
  • ...

LockedFlags(锁定用户中的字段不被编辑)

  • pkID
  • fkUserID
  • bFirstName (bool)
  • bLastName (bool)
  • bEmail (bool)

我很好奇为什么人们认为删除表上的身份插入是一个坏主意...如果我依靠 MSSQL 分配 PK,那么我可以在插入记录时看到一个实例进入数据库,在处理多次写入时,第二个表写入可能会得到不同的值...

【问题讨论】:

    标签: sql-server entity-framework


    【解决方案1】:

    听起来您在 LockedFlags 表中有孤立的行,例如具有指向已删除用户的用户 ID 的行。根据关系的设置方式,反过来也可以。

    如果您有一个实体,其中 2 个表合并为一个类,则加载实体集将查询两个表并需要匹配的行对。

    您的 LockedFlags 可能有一个用户属性,它正在尝试加载但在用户表中找不到。

    表格选项: 注意:我使用的是 MSSQL 等价物,因为我不知道 MYSQL。

    关于您的数据模型的评论: 我不知道 MYWSQL 是如何处理记录锁定的,但如果它像 MSSQL,你不必担心手动处理。

    如果您打算按原样使用它,我强烈建议您重新查看您的数据模型。如果您真的想手动锁定单个行字段,最好只使用单个表?

    编辑:

    ALTER TABLE LockFlags ADD CONSTRAINT
        FK_LockFlags_User FOREIGN KEY
        (
        UserID
        ) REFERENCES User
        (
        pkID
        ) ON UPDATE  NO ACTION 
         ON DELETE  NO ACTION 
    
    GO
    

    【讨论】:

    • 我正在使用 MSSQL... 我遇到的问题是这些表是在另一个应用程序的实体框架之外修改的。我现在正在为它编写一个 Web 前端,这就是我现在使用实体框架的原因。我的主要问题是 LockedFlags 表没有每个用户记录的记录。只有当一个字段被锁定时它才有记录......所以现在我不得不回去工作这就是为什么我试图弄清楚如何用正确的信息更新 LockedFlags 表然后尝试弄清楚如何最好地保持这项工作正常......
    • 哦,我没看最后一部分。我锁定的是文本输入框,而不是记录...
    • 我对你想要达到的目标有点困惑。无论您是否想保持数据完整性,都可以添加外键约束。我已在原始答案中添加了示例代码。
    • 小心,这可能会破坏导致数据不一致的 API。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多