如何在EF 7中用F#定义复合键?C#转译方案失效求助
EF Core 复合主键配置:C# 转 F# 正确实现
原C#代码
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<VehicleFeature>().HasKey(vf => new { vf.VehicleId, vf.FeatureId }); }
错误方案问题说明
你之前找到的代码fun x -> (x.VehicleId, x.FeatureId) :> obj)存在两个问题:
- 语法错误:多了一个多余的右括号;
- 逻辑问题:将元组强制转换为
obj无法被EF Core正确解析为复合键的表达式。
正确F#实现
override _.OnModelCreating(modelBuilder: ModelBuilder) = modelBuilder.Entity<VehicleFeature>() .HasKey(fun vf -> {| VehicleId = vf.VehicleId; FeatureId = vf.FeatureId |}) |> ignore
关键说明
- 使用F#的匿名记录
{| VehicleId = vf.VehicleId; FeatureId = vf.FeatureId |}对应C#中的匿名类型,EF Core可以正确识别并映射为复合主键; - 加上
|> ignore是为了处理HasKey返回的EntityTypeBuilder实例,避免F#的编译警告(F#不允许直接忽略非unit类型的返回值)。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

