Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.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#_Asp.net_Entity Framework_Entity Framework Core - Fatal编程技术网

C# 子类上唯一的实体框架

C# 子类上唯一的实体框架,c#,asp.net,entity-framework,entity-framework-core,C#,Asp.net,Entity Framework,Entity Framework Core,我对在实体框架中应该如何处理这种情况感到困惑 我有一个角色基类: public class Character { [Key] public Guid Id { get; set; } public Realm Realm { get; set; } public Guid RealmId { get; set; } public string Name { get; set; } } 角色具有名称并绑定到领域 玩家控制的角色绝对是一个角色。它绑定到玩家

我对在实体框架中应该如何处理这种情况感到困惑

我有一个角色基类:

public class Character
{
    [Key]
    public Guid Id { get; set; }
    public Realm Realm { get; set; }
    public Guid RealmId { get; set; }
    public string Name { get; set; }
}
角色具有名称并绑定到领域

玩家控制的角色绝对是一个角色。它绑定到玩家/用户:

public class PlayerCharacter : Character
{        
    public User User { get; set; }
    public Guid UserId { get; set; }
}
NPC也是一个角色:它不需要为一个角色设置任何属性

现在,很明显,您不希望在同一领域中使用相同名称的角色,但是您可以在单个领域中使用所需数量的
ORC
,因此我们需要在
PlayerCharacter
上定义唯一约束,例如通过
。HasAlternateKey

public DbSet<PlayerCharacter> Characters { get; set; }
public DbSet<Npc> Npcs { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<PlayerCharacter>()
        .HasAlternateKey("Name", "RealmId");
}
好的,一个唯一的索引怎么样

modelBuilder.Entity<PlayerCharacter>()
    .HasIndex("Name", "RealmId")
    .IsUnique();

$ dotnet ef migrations add 5
Done. To undo this action, use 'ef migrations remove'
modelBuilder.Entity()
.HasIndex(“名称”、“RealmId”)
.IsUnique();
$dotnet ef迁移添加5
完成。要撤消此操作,请使用“ef migrations remove”
成功了!但是等等:

migrationBuilder.CreateTable(
    name: "Character",
    columns: table => new
    {
        Id = table.Column<Guid>(nullable: false),
        Discriminator = table.Column<string>(nullable: false),
        Name = table.Column<string>(nullable: true),
        RealmId = table.Column<Guid>(nullable: false),
        // other props...
    },
    constraints: table =>
    {
        table.PrimaryKey("PK_Character", x => x.Id);
        // foreign keys...
    });

migrationBuilder.CreateIndex(
    name: "IX_Character_Name_RealmId",
    table: "Character",
    columns: new[] { "Name", "RealmId" },
    unique: true);
migrationBuilder.CreateTable(
名称:“字符”,
列:表=>new
{
Id=table.Column(可空:false),
鉴别器=表.列(可空:false),
Name=table.Column(可空:true),
RealmId=table.Column(可空:false),
//其他道具。。。
},
约束:表=>
{
表.PrimaryKey(“PK_字符”,x=>x.Id);
//外键。。。
});
migrationBuilder.CreateIndex(
名称:“IX_Character_name_RealmId”,
表:“字符”,
列:新[]{“Name”,“RealmId”},
独特:正确);

现在玩家角色和NPC的名字都是独一无二的!如何仅在派生类中设置唯一性?

当前唯一的方法(EF Core 2.0.1)是使用基于值的过滤唯一索引

不幸的是,fluentapi不是db不可知的。以下是SqlServer的配置:

modelBuilder.Entity<PlayerCharacter>()
    .HasIndex("Name", "RealmId")
    .IsUnique()
    .HasFilter("Discriminator = 'PlayerCharacter'"); // <--
modelBuilder.Entity()
.HasIndex(“名称”、“RealmId”)
.IsUnique()

.HasFilter(“鉴别器='PlayerCharacter'”);//你在设置TPH,对吗?@IvanStoev,什么是TPH?继承策略是否支持Pgsql?无法测试,但根据,数据库通过
创建索引
WHERE谓词
子句支持它,因此EFC Pgsql提供程序支持它应该没有问题。
migrationBuilder.CreateTable(
    name: "Character",
    columns: table => new
    {
        Id = table.Column<Guid>(nullable: false),
        Discriminator = table.Column<string>(nullable: false),
        Name = table.Column<string>(nullable: true),
        RealmId = table.Column<Guid>(nullable: false),
        // other props...
    },
    constraints: table =>
    {
        table.PrimaryKey("PK_Character", x => x.Id);
        // foreign keys...
    });

migrationBuilder.CreateIndex(
    name: "IX_Character_Name_RealmId",
    table: "Character",
    columns: new[] { "Name", "RealmId" },
    unique: true);
modelBuilder.Entity<PlayerCharacter>()
    .HasIndex("Name", "RealmId")
    .IsUnique()
    .HasFilter("Discriminator = 'PlayerCharacter'"); // <--