用自定义属性实现复合主键的思路
2022-08-20 12:50 Lecone.JY.HU 阅读(560) 评论(1) 编辑 收藏 举报使用efcore的时候,使用复合主键来表示实体,很多官网推荐
[Key("",Order)]
这种方式来实现,但是很大程度上会报错。
“the entity type '' has multiple properties with the [Key] attribute. Composite primary keys can only be set using 'HasKEey' in 'OnModelCreating'”
使用自定义属性
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)] public class CompositeKeysAttribute : Attribute { private string name; public int Order; public CompositeKeysAttribute(string name) { this.name = name; Order = 1; } } }
在OnModelCreating中设置key
void AdKeyAction(ModelBuilder modelBuilder) { foreach (var mutableEntityType in modelBuilder.Model.GetEntityTypes()) { if (mutableEntityType.ClrType == null) continue; var files = mutableEntityType.ClrType.GetMembers().Where(c=>c.CustomAttributes.Any(c=>c.AttributeType==typeof(CompositeKeysAttribute))); var properties = new List<string>(); foreach (var f in files) { properties.Add(f.Name); } if (properties.Count > 0) { modelBuilder.Entity(mutableEntityType.ClrType).HasKey(properties.ToArray()); } } }
使用的时候
public class User { [CompositeKeys("UserName",Order=1)]
public string UserName{set;get;}
[CompositeKeys("UserArea",Order=2)]
public string UserArea{get;set;}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构