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'"); // <--