[{"data":1,"prerenderedAt":121},["ShallowReactive",2],{"navigation":3,"post-\u002Fposts\u002F2016\u002Fasp-net-core-ef-sqlite-add-foreign-key-to-exist-table":20,"surroundPosts-\u002Fposts\u002F2016\u002Fasp-net-core-ef-sqlite-add-foreign-key-to-exist-table":108},[4,8,12,16],{"title":5,"path":6,"stem":7},"首页","\u002F","00.index",{"title":9,"path":10,"stem":11},"文章","\u002Fposts","01.posts",{"title":13,"path":14,"stem":15},"动态","\u002Fmoments","02.moments",{"title":17,"path":18,"stem":19},"关于","\u002Fabout","09.about",{"id":21,"title":22,"body":23,"class":88,"cover":88,"coverSize":88,"date":89,"description":90,"draft":91,"extension":92,"hideComments":91,"location":88,"meta":93,"navigation":94,"path":95,"readingTime":96,"seo":101,"sitemap":102,"stem":103,"tags":104,"time":88,"weather":88,"__hash__":107},"posts\u002Fposts\u002F2016\u002F20161208.asp-net-core-ef-sqlite-add-foreign-key-to-exist-table.md","Entity Framework Core SQLite provider 向已存在的表中添加外键",{"type":24,"value":25,"toc":84},"minimark",[26,38,41,44,47,50,81],[27,28,29,30,37],"p",{},"SQLite 本身不支持向已创建的表中添加外键，类似的限制还有很多，比较蛋疼，具体可以参见",[31,32,36],"a",{"href":33,"rel":34},"https:\u002F\u002Fdocs.microsoft.com\u002Fen-us\u002Fef\u002Fcore\u002Fproviders\u002Fsqlite\u002Flimitations",[35],"nofollow","SQLite Limitations","。",[27,39,40],{},"项目中，如果是测试的时候，数据不是很重要的话，最方便的方法就是把已经创建的 Migrations 包括 ModelSnapshot 都删掉，重新 Add-Migration 重建数据库。",[27,42,43],{},"对于已经发布的应用，数据库不能删了创建的话，可以“曲线救国”。",[27,45,46],{},"假设需要给 TableA 添加一个需要建立外键的字段 ColumnA，为了增加难度，假设 TableB 中的 Column",[27,48,49],{},"B 是 TableA 的外键。具体操作方法如下：",[51,52,53,57,60,63,66,69,72,75,78],"ol",{},[54,55,56],"li",{},"先在代码中 TableA 里添加 ColumnA（不设置外键），Add-Migration，更新到线上数据库",[54,58,59],{},"将本地的数据库改名为 database-backup，删除项目中所有 Migrations 和 ModelSnapshot，创建一个 RebuildDatabase 的 Migration，创建全新的数据库，从新数据库中复制 TableA 的 Create Statement SQL 语句并将改 SQL 语句中的表名改为 TableA-New",[54,61,62],{},"在线上数据库中执行步骤 2 中的 SQL 语句，将创建 TableA-New（已经含有外键约束了）",[54,64,65],{},"导出线上数据库中 TableA 中的数据到 SQL 文件中，并将该 SQL 文件中的表名改为 TableA-New",[54,67,68],{},"将步骤 4 中的 SQL 文件的数据导入到线上数据库中",[54,70,71],{},"将线上数据库的 TableA 改名为 TableA-Old，将 TableA-New 改名为 TableA",[54,73,74],{},"因为重命名的关系，这时候 TableB 中的 ColumnB 是 TableA-Old 的外键，通过如下方法，将 TableB 中的外键约束改到 TableA 中：复制 TableB 的 Create Statement，创建一个 TableB-New，其中的 ColumnB 是 TableA 的外键，然后将 TableB 改名为 TableB-Old，并将 TableB-New 改名为 TableB（如果还有 TableC 中有 TableB-Old 的外键，通过同样的方法操作，以此类推），删除 TableB-Old。（如果没有这样的 TableB，则此步骤省略）",[54,76,77],{},"删除 TableAOld",[54,79,80],{},"清空线上数据库__EFMigrationHistory 表中的数据，并手动添加一条数据，以 RebuildDatabase 的 Migration 的文件名作为 MigrationId，并输入当前的 ProductVersion",[27,82,83],{},"收工！",{"title":85,"searchDepth":86,"depth":86,"links":87},"",2,[],null,"2016-12-08","SQLite 本身不支持向已创建的表中添加外键，类似的限制还有很多，比较蛋疼，具体可以参见SQLite Limitations。",false,"md",{},true,"\u002Fposts\u002F2016\u002Fasp-net-core-ef-sqlite-add-foreign-key-to-exist-table",{"text":97,"minutes":98,"time":99,"words":100},"3 min read",2.535,152100,507,{"title":22,"description":90},{"loc":95},"posts\u002F2016\u002F20161208.asp-net-core-ef-sqlite-add-foreign-key-to-exist-table",[105,106],"技术",".NET","_hu7m8FKjqaeMscDcXPApg4_4iD34-7HKcNatqV5v3o",[109,115],{"title":110,"path":111,"stem":112,"date":113,"description":114,"children":-1},"小黑啊小黑 T.T","\u002Fposts\u002F2016\u002Fsmall-black-dog","posts\u002F2016\u002F20161213.small-black-dog","2016-12-13","昨天爸爸从成都开车回老家了，连续开了 22 小时，1900 公里到老家了。",{"title":116,"path":117,"stem":118,"date":119,"description":120,"children":-1},"自建 NAS 及 DDNS","\u002Fposts\u002F2016\u002Fnas","posts\u002F2016\u002F20161121.nas","2016-11-21","众所周知的原因，前段时间 360 云盘也倒下了，之前大部分照片、电影资源都放在 360 云盘上。由于国内的环境，感觉第三方云盘的可靠程度还不如自己建个 NAS。前端时间研究了硬件方案，今天研究了下外网访问的方案。",1777580284335]