我使用实体框架5.0代码第一;
public class Entity
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public string EntityId { get; set;}
public int FirstColumn { get; set;}
public int SecondColumn { get; set;}
}
我想让FirstColumn和SecondColumn的组合是唯一的。
例子:
Id FirstColumn SecondColumn
1 1 1 = OK
2 2 1 = OK
3 3 3 = OK
5 3 1 = THIS OK
4 3 3 = GRRRRR! HERE ERROR
有办法吗?
我想补充我的答案,因为提供的解决方案对我没有帮助。在我的例子中,其中一列是外键引用。
旧的模型:
public class Matrix
{
public int ID { get; set; }
public MachineData MachineData { get; set; }
public MachineVariant MachineVariant { get; set; }
}
注意,MachineVariant是一个enum, MachineData是一个引用。
尝试使用@Bassam Alugili提供的解决方案:
modelBuilder.Entity<Matrix>()
.HasIndex(sm => new { sm.MachineData, sm.DoughVariant }).IsUnique(true);
没有工作。所以我为machineData外键添加了一个ID列,如下所示:
public class Matrix
{
public int ID { get; set; }
public MachineData MachineData { get; set; }
[ForeignKey("MachineData")]
public int MachineDataID { get; set; }
public MachineVariant MachineVariant { get; set; }
}
并将模型构建器代码更改为:
modelBuilder.Entity<Matrix>()
.HasIndex(sm => new { sm.MachineDataID, sm.DoughVariant }).IsUnique(true);
哪一种方法得到了想要的解决方案
对于那些在寻找2021年解决方案的人来说,公认答案的工作版本现在应该是这样的:
[Index(nameof(FirstColumn), nameof(SecondColumn), IsUnique = true)]
public class Entity
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public string EntityId { get; set;}
public int FirstColumn { get; set;}
public int SecondColumn { get; set;}
}
因此,注释应该存在于模型上,而不是单独的列上。还要注意nameof()语法。
这个答案来自于官方文档:https://learn.microsoft.com/en-us/ef/core/modeling/indexes?tabs=data-annotations