如何定义在EF6一个多层次的唯一索引约束

问题描述 投票:1回答:2

EF使我们能够对多个属性,像这样定义唯一索引的约束:

public class Part 
{
        public int Id { get; set; }
        [Index("IX_Name_Factory", Order = 1, IsUnique = true)]
        public string Name {get;set;}
        [Required]
        public Factory Factory { get; set; }
        [ForeignKey("Factory"), Index("IX_Name_Factory", Order = 2, IsUnique = true)]
        public int Factory_Id {get;set;}
}

这使我有这对一个给定的工厂唯一的名称的一部分。但是,如果我有什么每个区域的多个工厂,出于某种原因,我想有一个部分一个名称跨区域独特的,不只是一个工厂。该结构将是地区 - >厂 - >部分。我将如何定义唯一索引对于这样的条件,因为区域不是部分的直接属性?

编辑:既然看来这不太可能在EF6定义,我打开SQL Server中直接这样做。有人可以请让我知道我可以在SQL Server中做到这一点?

c# .net sql-server entity-framework entity-framework-6
2个回答
1
投票

什么你想实现意味着该部分实体逻辑必须知道它属于地区,因为它是唯一被它定义。那么,为什么不只是让部分有地区参考过,并使用该关系的关键是你的唯一键的一部分吗?


1
投票

我想有一个名字跨区域,其独特的,不只是一个工厂的一部分。 。 。 [和]确保Part.Factory.Region.Id总是相同Part.Region.Id不管是什么?

你让工厂(RegionID,FactoryID)的关键,部分以及(RegionID,FactoryID,PARTID)的关键。因此,部分是指工厂使用(RegionID,FactoryID)的外键。

这将确保零件的RegionID总是相同部分的工厂的RegionID。

然后做一个Part.Name的区域内是唯一的,在部分(RegionID,名称)添加一个唯一索引。

在SQL Server(或SQL Azure的数据库)工作直接,你可以在一个indexed view创建唯一索引,也完全避免其上部分中RegionID列。例如:

use tempdb

go
drop table if exists Part
drop table if exists Factory
drop table if exists Region 
go

create table Region(RegionID int primary key);
create table Factory(FactoryID int primary key, RegionID int references Region);
create table Part(PartID int primary key, FactoryID int references Factory, Name varchar(200));

go

create view vRegionPartName
with schemabinding
as
select r.RegionID, p.Name PartName
from dbo.Region r
join dbo.Factory f
  on r.RegionID = f.RegionID
join dbo.Part p 
  on p.FactoryID = f.FactoryID

go

create unique clustered index pk_vRegionPartName
on vRegionPartName(RegionID,PartName)

go

insert into Region(RegionID) values (1)
insert into Factory(FactoryID,RegionID) values (1,1)
insert into Factory(FactoryID,RegionID) values (2,1)
insert into Part(PartID,FactoryID,Name) values (1,1,'Part1')

insert into Part(PartID,FactoryID,Name) values (2,2,'Part1')
--fails with
--Msg 2601, Level 14, State 1, Line 36
--Cannot insert duplicate key row in object 'dbo.vRegionPartName' with unique index 'pk_vRegionPartName'. The duplicate key value is (1, Part1).
© www.soinside.com 2019 - 2024. All rights reserved.