Asp.net core 学习笔记 ef core Surrogate Key, Natural Key, Alternate Keys

Surrogate Key vs Natural Key, 争论多年 

https://www.mssqltips.com/sqlservertip/5431/surrogate-key-vs-natural-key-differences-and-when-to-use-in-sql-server/

2 个都有好处坏处. 

ef core 对 Natural Key 支持比较弱. 

使用 Alternate Keys 来实现

https://docs.microsoft.com/en-us/ef/core/modeling/alternate-keys

它最糟糕的地方是,目前不支持修改 

https://stackoverflow.com/questions/36200436/cannot-update-alternate-key-entity-framework-core-1-0

https://github.com/aspnet/EntityFrameworkCore/issues/4073

 

对我来说大部分情况下 Surrogate Key 是好用的

但它凡事都要 join 表比较麻烦, filter 也好,查询值也好,都一定要 join.

所以我认为 Natural Key 只在一种情况下特别好

join 的 table 只是一个 primary column

比如有个 category 和 product 

category 只有一个 name, 如果做一个 category 表那每次 product 就得 join category 为了拿唯一的 category name。

而如果 product 直接记入 category name 就方便多了. 

 

短期内 ef 应该是不会支持 update 这个功能的,saveChanges 就报错说不能 edit 了,

目前的 workaround 是去 override migration 生成出来的 file 添加 onUpdate cascade,

table.ForeignKey(
    name: "FK_Products_Categories_categoryName",
    column: x => x.categoryName,
    principalTable: "Categories",
    principalColumn: "name",
    onDelete: ReferentialAction.Restrict,
    onUpdate: ReferentialAction.Restrict);

然后更新的时候直接调用语句.  

var commandText = "update Categories set name = @categoryName where Id = @Id";
var categoryName = new SqlParameter("@categoryName", "man");
var Id = new SqlParameter("@Id", 1);
var ok = Db.Database.ExecuteSqlCommand(commandText, new[] { categoryName, Id });

 

转载于:https://www.cnblogs.com/keatkeat/p/11407886.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值