.Net实体框架具有外键的核心唯一索引

时间:2020-03-25 08:00:37

标签: c# entity-framework-core

问题: 嗨,大家好。我正在使用EF core 2.1,我需要在表InstallationInformation中将属性LicenceKey和Importrun(FK)赋予唯一索引(组合)。

添加的信息: 如果我对我所做的研究正确。我无法在.net Core 2.1中使用注释[index],因为它不受支持。我试图升级,但它需要我没有的VS 2019。要使用VS 2019,我需要我也没有使用过的Windows 10。

我尝试过的方法。 我尝试了Annotation的东西。但是不幸的是它没有用。 我发现可以尝试使用Fluent API,并且可以映射该属性。

modelBuilder.Entity<InstallationInformation>(entity =>
            {
                entity.HasIndex(i => new { i.LicenceKey, i.ImportRun }).IsUnique();
            });

但是当我调试时,出现了此错误 “ InvalidOperationException:'ImportRun'不能用作实体类型'InstallationInformation'的属性,因为它被配置为导航。”

代码结构:

public class ImportRun
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ImportRunId { get; set; }

        public DateTime ExtractedDate { get; set; }

        public DateTime ProcessDate { get; set; }

        public ResultCondition ProcessResult { get; set; }        

        public string FailureDescription { get; set; }

        [Required]
        public virtual ICollection<InstallationInformation> InstallationInformation { get; set; }

    }
public class InstallationInformation
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int InstallationInformationID { get; set; }

        [MaxLength(256)]
        public string LicenceKey { get; set; }

        [MaxLength(256)]
        public string ProductVersion { get; set; }

        [MaxLength(256)]
        public string ProductName { get; set; }        

        [MaxLength(256)]
        public string CompanyName { get; set; }

        public DateTime Timestamp { get; set; }
        [Required]
        public ImportRun ImportRun { get; set; }
    }
protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<ImportRun>()
                .HasMany(c => c.InstallationInformation)
                .WithOne(e => e.ImportRun)
                .IsRequired();

            modelBuilder.Entity<InstallationInformation>(entity =>
            {
                entity.HasIndex(i => new { i.LicenceKey, i.ImportRun }).IsUnique();
            });
        }

1 个答案:

答案 0 :(得分:0)

更改:

            modelBuilder.Entity<InstallationInformation>(entity =>
            {
                entity.HasIndex(i => new { i.LicenceKey, i.ImportRun }).IsUnique();
            });

收件人:

            modelBuilder.Entity<InstallationInformation>(entity =>
            {
                entity.HasIndex(i => new { i.LicenceKey, i.ImportRunId }).IsUnique();
            });