gpt4 book ai didi

c# - 在 Entity Framework 中添加鉴别器列作为唯一索引的一部分

转载 作者:太空狗 更新时间:2023-10-29 21:44:22 24 4
gpt4 key购买 nike

是否可以使用 EF Fluent API 将鉴别器列和另一个字符串列配置为唯一索引约束的一部分?

我有一个标识符列表,其中标识符可以是不同类型的。每个标识符都有一个字符串类型的属性,其中包含标识字符串。

在我的例子中,一个客户可以有不同的标识符。但是每个鉴别器只能有一个具有唯一字符串的标识符。

定义标识符类型的抽象类

 public abstract class CustomerIdentifier : Entity<int>
{
public string Identifier { get; set; }
}

派生自 CustomerIdentifier 的具体类

 class NationalIdNumberIdentifier : CustomerIdentifier
{
}

我已经设法使用这里的答案为字符串列配置索引, Unique Key constraints for multiple columns in Entity Framework如下

class CustomerIdentifierMap : EntityTypeConfiguration<CustomerIdentifier>
{
public CustomerIdentifierMap()
{
Property(p => p.Identifier).HasMaxLength(100).IsRequired().HasUniqueIndexAnnotation("UQ_IdentifierPerDiscriminator", 0);
}
}

我需要以某种方式在此处添加另一行,指定鉴别器应包含在唯一索引约束中。

最佳答案

其实在EF 6中就可以做到。下面是一个使用主键创建唯一索引的例子。

internal class DiscriminatorServerMigrationSqlGenerator : SqlServerMigrationSqlGenerator
{
const string DiscriminatorColumnName = "Discriminator";
protected override void Generate(CreateTableOperation op)
{
base.Generate(op);
if (op.Columns.Any(x => x.Name == DiscriminatorColumnName))
{
if (op.PrimaryKey != null && op.PrimaryKey.Columns.Any())
{
CreateDiscriminatorIndex(op.Name, true, op.PrimaryKey.Columns.ToArray());
}
else
{
CreateDiscriminatorIndex(op.Name);
}
}
}
private void CreateDiscriminatorIndex(string tableName, bool isUnique = false, params string[] columns)
{
var cols = "[Discriminator]";
if (columns.Length > 0)
{
cols += ", " + string.Join(", ", columns.Select(x => "[" + x + "]"));
}
var unique = isUnique ? "UNIQUE" : "";
using (var writer = Writer())
{
var str = $@"
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Discriminator' AND object_id = OBJECT_ID(N'{tableName}'))
EXECUTE('CREATE {unique} NONCLUSTERED INDEX [IX_Discriminator] ON {tableName} ({cols})')";
writer.WriteLine(str);
Statement(writer);
}
}

}

关于c# - 在 Entity Framework 中添加鉴别器列作为唯一索引的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28152703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com