实体框架(核心),不是键的唯一“复合列”

时间:2018-09-26 10:10:08

标签: entity-framework-core

我有以下课程

public Building()
{
   public int Id{Get; Set;};
   public ICollection Bars{Get; Set;};
}

public Room()
{
   public int Id{Get; Set;};

   public int BuildingId{Get; Set;};
   public Building Building{Get; Set;}; 

   public string Name{Get; Set;); 
}

我希望建筑物中的每个房间都有唯一的名称。但是我不能使Name属性唯一,因为不同的建筑物可能具有相同的房间名称

Room Table
Id    BuildingId    Name
1     1             Kitchen   
2     2             Kitchen    //Should be allowed as different building
3     1             Kitchen    //Should not be allowed

我唯一想到的解决方案是在BuildingId和Name之间建立一个复合键。

modelBuilder.Entity<Room>().HasKey(r=> new {r.BuildingId, r.Name});

获取房间会在App中发生很多,并且将Key保留为简单整数会更加容易。有没有一种方法可以使它成为唯一的复合列而无需使其成为键?

我相信我需要与Index相关,但是我可以找到一个关于事后工作的有效示例。

1 个答案:

答案 0 :(得分:1)

在这种情况下,您不必使用复合键,而是可以使组合成为唯一键。您必须使用如下的HasIndexIsUnique方法。

modelBuilder.Entity<Room>(b =>
            {
                b.HasIndex(e => new { e.BuildingId, e.Name}).IsUnique();
            });