c# - 使用实体框架联合复合时使两列唯一
问题描述
我有两列名为Monkey和Donkey。两者都是非空的,即null
不允许。设置声明如下。
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
...
builder.Entity<Thing>()
.Property(a => a.Monkey)
.IsRequired();
builder.Entity<Thing>()
.Property(a => a.Donkey)
.IsRequired();
}
现在,我了解到组合的内容必须是唯一的,即没有记录可能具有相同的猴子和驴。根据MSDN(多个道具的索引),我应该使用HasColumnAnnotation
并传递IndexAnnotation
. 此答案中还建议使用IndexAnnotation.AnnotationName
from System.Data.Entity.Infrastructure.Annotations
。
问题是我找不到该方法,而只能看到HasAnnotation
. 我不清楚它是否是更新的版本(因为链接到的帖子现在有点过时了)。我也无法访问语句中的命名空间实体。using
builder.Entity<Thing>()
.Property(a => a.Monkey)
.HasAnnotation(...);
这是正确的方法还是我应该继续寻找其他注释方法?获取命名空间缺少什么?索引是开始的适当方式吗?
我也尝试过使用 index ,但这需要我声明一个专门的类,这看起来很笨重,并且表明这是错误的方法。
builder.Entity<Thing>()
.HasIndex(a => new IndexDedicatedClass(a.Monkey, a.Donkey))
.IsUnique();
解决方案
您可以添加一个跨多列的复合索引,然后将其标记为唯一,这会在数据库上创建一个唯一索引。
modelBuilder.Entity<Thing>(builder =>
{
builder
.HasIndex(e => new { e.Monkey, e.Donkey })
.IsUnique();
});
这实际上有助于确保没有($monkey, $donkey)
元组在表中出现两次。
更多信息
推荐阅读
- ruby-on-rails - 如何修复 Rails 服务器启动时冻结或无法继续启动
- go - 如何在不重复的情况下测试功能?
- linux - Bash 循环只读取最后一行
- css - css中的替代彩色表格行
- tags - 读取/获取 DM3 文件的放大倍数的代码/命令是什么?
- php - 验证电子邮件后将用户重定向到自定义页面
- javascript - 如何将茉莉花测试套装包装成函数表达式
- php - 如何在 WooCommerce 中建立基本的产品资料?
- html - 如何添加网站用户可以添加图钉的地图
- reactjs - 使用 Webpack 和 Typescript 创建 React 组件库,但 WP 一直在捆绑 React