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中做到这一点?
什么你想实现意味着该部分实体逻辑必须知道它属于地区,因为它是唯一被它定义。那么,为什么不只是让部分有地区参考过,并使用该关系的关键是你的唯一键的一部分吗?
我想有一个名字跨区域,其独特的,不只是一个工厂的一部分。 。 。 [和]确保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).