Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架:基于父实体上的值为子实体编制索引以实现唯一性_C#_Entity Framework 6_Data Annotations_Entity Relationship_Unique Constraint - Fatal编程技术网

C# 实体框架:基于父实体上的值为子实体编制索引以实现唯一性

C# 实体框架:基于父实体上的值为子实体编制索引以实现唯一性,c#,entity-framework-6,data-annotations,entity-relationship,unique-constraint,C#,Entity Framework 6,Data Annotations,Entity Relationship,Unique Constraint,我有一个简短的问题,正在寻找最好的方法,EF是否有能力,我不确定?我正在使用EntityFramework 6.3 我有以下亲子场景 public class Application{ [Key] public int ApplicationId {get;set;} public string Name {get;set;} public string Status {get;set;} public virtual List<Document> Documents {

我有一个简短的问题,正在寻找最好的方法,EF是否有能力,我不确定?我正在使用EntityFramework 6.3

我有以下亲子场景

public class Application{
 [Key]
 public int ApplicationId {get;set;}
 public string Name {get;set;}
 public string Status {get;set;}

 public virtual List<Document> Documents {get;set;}
}

public class Document{
 [Key]
 public int DocumentId {get;set;}
 [Index("IX_ApplicationDocument", 1, IsUnique = true)]
 public string DocumentType {get;set;}
 [Index("IX_ApplicationDocument", 1, IsUnique = true)]
 public string Name {get;set;}

 public int ApplicationId {get;set;}

 [ForeignKey("ApplicationId")]
 public Application Application {get;set;}
}
公共类应用程序{
[关键]
public int ApplicationId{get;set;}
公共字符串名称{get;set;}
公共字符串状态{get;set;}
公共虚拟列表文档{get;set;}
}
公共类文档{
[关键]
public int DocumentId{get;set;}
[索引(“IX_应用程序文档”,1,IsUnique=true)]
公共字符串DocumentType{get;set;}
[索引(“IX_应用程序文档”,1,IsUnique=true)]
公共字符串名称{get;set;}
public int ApplicationId{get;set;}
[外键(“应用程序ID”)]
公共应用程序应用程序{get;set;}
}

因此,向一个部门提出申请,并将其存储在数据库中,每个申请都有一个状态,在提交时,状态为“待定”,因为在批准之前必须进行各种验证。当申请被拒绝时,提交人必须提出新的申请(请注意,我使用了一个比实际情况更简单的示例),但是,申请人可以再次提交相同的文件。问题是,这已经存在于系统中,无法复制。如您所见,他们第二次尝试提交时将抛出约束异常。我如何使用EF克服这个问题,有没有一种方法可以基于父对象的状态创建约束,或者这只能通过编程来完成?

不知道这对您的情况是否有帮助,但请检查一下

假设您的实体定义为

public class Entity
{
    public int Id { get; set; }
    public int Parent { get; set; }
    public int Child { get; set; }
}
以下fluent API代码将根据需要创建索引:

modelBuilder.Entity<Entity>().HasIndex(p => new {p.Parent, p.Child})
        .HasFilter("isdeleted = 0")
        .HasName("unq_t_parent_child");
HasIndex定义表实体中属性的索引

HasFilter允许您为索引设置筛选器。此值是sql,因此您需要确保编写的sql语法正确

HasName配置索引的名称

(如果将实体映射到表t,并将属性映射到它们的列名,则迁移将创建完全相同的sql。)


此外,检查约束与唯一索引不同。如果您希望添加检查约束,那么您需要在迁移文件中使用migrationBuilder.Sql。

因此,很遗憾,我已经四处搜索了,对于EF 6没有解决方案。我能做到这一点的最好方法是遵循以下文章的指导,在创建表之后,在迁移中手动添加过滤索引


哦,天哪,这正是我一直在寻找的,我知道您可以在Oracle中实现这一点,只是不知道如何从编码角度实现这一点。非常感谢你@Syed_Wahhab。这让我的很多场景大开眼界:-)有一个问题,isdeleted,这是实体的属性还是保留字?不,donny'isdeleted'不是EF的属性。不幸的是,此解决方案是针对EntityFramework Core的,并指定了我使用的版本:-(我使用的是EntityFramework 6.3。您能澄清一点吗,您希望documentId在将来是唯一的,但在现有的情况下可以重复吗?基本上,如果您希望避免新条目重复,那么您可以使用Entity Framework在SQL Server上创建一个经过筛选的唯一索引。如果是这样,请告诉我
CREATE INDEX [unq_t_parent_child] ON [Entity] ([Parent], [Child]) WHERE isdeleted = 0;