C# EF Core Fluent API-迁移中未检测到/包含唯一约束

C# EF Core Fluent API-迁移中未检测到/包含唯一约束,c#,sql-server,entity-framework-core,ef-fluent-api,C#,Sql Server,Entity Framework Core,Ef Fluent Api,我试图在两列上添加唯一的约束。我发现多个来源声明我应该使用HasAlternateKey方法用于EF核心Fluent API应用程序。但是,在运行Add Migration之后,在迁移文件中生成的代码不包含该约束,就好像故意忽略或未检测到该约束一样 以下是我正在使用的ModelBuilder代码: modelBuilder.Entity<PlasmidStockCode>(e => { e.ToTable("Plasmid

我试图在两列上添加唯一的约束。我发现多个来源声明我应该使用HasAlternateKey方法用于EF核心Fluent API应用程序。但是,在运行Add Migration之后,在迁移文件中生成的代码不包含该约束,就好像故意忽略或未检测到该约束一样

以下是我正在使用的ModelBuilder代码:

        modelBuilder.Entity<PlasmidStockCode>(e =>
        {
            e.ToTable("PlasmidStockCode");

            e.HasKey(c => c.ID);
            e.Property(c => c.ID).ValueGeneratedOnAdd();

            e.HasAlternateKey(c => new { c.ClientName, c.PlasmidName });

            e.HasMany(c => c.PlasmidStockComments).WithOne().HasForeignKey(c => c.PlasmidStockCodeID).OnDelete(DeleteBehavior.Restrict);
            e.HasMany(c => c.PlasmidStockLots).WithOne().HasForeignKey(c => c.PlasmidStockCodeID).OnDelete(DeleteBehavior.Restrict);
            e.HasMany(c => c.qPCRTargets).WithOne().HasForeignKey(c => c.PlasmidStockCodeID).OnDelete(DeleteBehavior.Restrict);
        });

        AddBaseConfiguration(modelBuilder);
    }
modelBuilder.Entity(e=>
{
e、 ToTable(“质粒密码”);
e、 HasKey(c=>c.ID);
e、 属性(c=>c.ID);
e、 HasAlternateKey(c=>new{c.ClientName,c.PlasmidName});
e、 HasMany(c=>c.PlasmidStockComments).WithOne().HasForeignKey(c=>c.PlasmidStockCodeID).OnDelete(DeleteBehavior.Restrict);
e、 HasMany(c=>c.PlasmidStockLots).WithOne().HasForeignKey(c=>c.PlasmidStockCodeID).OnDelete(DeleteBehavior.Restrict);
e、 HasMany(c=>c.qPCRTargets).WithOne().HasForeignKey(c=>c.PlasmidStockCodeID).OnDelete(DeleteBehavior.Restrict);
});
AddBaseConfiguration(modelBuilder);
}
我还尝试使用.HasIndex,但不幸的是,它也没有被检测到/包含


你知道我遗漏了什么吗?提前谢谢

我做了类似的事情,似乎效果很好:

 builder.Entity<AccountUser>().HasAlternateKey(c => new { c.a, c.b });

在DBContext类的OnModelCreating方法中使用
IsUnique
HasIndex
方法将复合键添加到表中。然后使用
add migration
添加迁移,然后在Program Manager控制台中运行
Update Database

modelBuilder.Entity<PlasmidStockCode>(b =>
    {
        b.HasIndex(e => (new { e.ClientName, e.PlasmidName })).IsUnique();
    });
modelBuilder.Entity(b=>
{
b、 HasIndex(e=>(新的{e.ClientName,e.PlasmidName})).IsUnique();
});

您的ModelSnapshot是否处于有效状态,并反映了您在fluent API中所做的配置?因为EF根据ModelSnapshot和以前的迁移之间的差异生成新的迁移文件,所以只需在我的工作站上使用命令
Scaffold DbContext“Server=localhost;Database=Test1;Trusted_Connection=True;”Microsoft.EntityFrameworkCore.SqlServer-OutputDir Models'
,尝试相同的方法,这导致了以下代码:
entity.HasIndex(e=>new{e.Lastname,e.Lastname}).HasName(“UniqueName”).IsUnique()
您使用的是哪个版本的.NET Core?方法
AddBaseConfiguration()
有什么作用?@i常规AddBaseConfiguration是我们基本模型中的一种方法。它将所有基本字段添加到表/模型中,例如IsActive、LastUpdateBy、LastUpdateDate等。现在的情况是,这个问题无法回答,因为
HasAlternateKey
HasIndex
都应该可以工作。请提供。他的方法可以做到这一点。@iregular没有让你明白吗?我很感激你的回答,但不幸的是,这不起作用。我更改了代码以反映这一点,运行了另一次添加迁移,并且生成的迁移文件(在up或down方法中)没有任何更改。您的类是添加到DBContext文件中的吗?您是添加还是更改表?我尝试了此操作,也尝试了下面的Vivek代码,但不幸的是,也不会对生成的迁移文件中的up/down方法产生任何更改。我被难住了。需要注意的是,我必须将列的最大长度和所需属性设置为模型(StringLength)中的数据注释,而不是ModelBuilder中的数据注释,因为它们也没有被检测到/添加到生成的迁移文件中。好吧,idk,如果操作正确,这应该可以工作(我和bouke都尝试过)。正如我在评论中指出的,您是否看到快照中反映的modelbuilder中的更改?
modelBuilder.Entity<PlasmidStockCode>(b =>
    {
        b.HasIndex(e => (new { e.ClientName, e.PlasmidName })).IsUnique();
    });