C# 自引用实体框架模型
提前感谢你的帮助 我正试图和一个朋友为一个小型rpg制作一个数据库。到目前为止,我们一直在跟踪JSON文件中的攻击类型(我的朋友不懂技术,所以我们早期仅在纯文本文件上妥协)。我想让他成为一个网站,这样他就可以更容易地编辑我们想法之间的关系(类型、怪物种类、可能的攻击等) 因此,我从中提取的数据如下所示:C# 自引用实体框架模型,c#,json,entity-framework,C#,Json,Entity Framework,提前感谢你的帮助 我正试图和一个朋友为一个小型rpg制作一个数据库。到目前为止,我们一直在跟踪JSON文件中的攻击类型(我的朋友不懂技术,所以我们早期仅在纯文本文件上妥协)。我想让他成为一个网站,这样他就可以更容易地编辑我们想法之间的关系(类型、怪物种类、可能的攻击等) 因此,我从中提取的数据如下所示: { "name": "water", "isElement": true, "defendAgainst": [ "fire", "unde
{
"name": "water",
"isElement": true,
"defendAgainst": [
"fire",
"undead",
"atomic",
"food"
],
"immuneTo": [
"water"
],
"weakTo": [
"electric",
"zoetic",
"sonic",
"eldritch"
]
}, ... and so on
在这个例子中,水是一种元素,它可以抵抗火,它对水的攻击免疫,对声音的攻击也很弱
我做了一件事,将JSON转换成一个对象,最终得到如下结果:
public class monsterType
{
[Key]
public string name { get; set; }
public ICollection<monsterType> weakTo { get; set; }
public ICollection<monsterType> immuneTo { get; set; }
public ICollection<monsterType> defendAgainst { get; set; }
public bool isElement { get; set; }
}
执行此操作时,会在db.SaveChanges()上显示以下错误:
违反了多重性约束。角色
关系的“monsterType_防御_来源”
“ParseMonsterYaml.monsterType_Defendency”的多重性为1或
0..1
我不太清楚为什么这是个问题
它还创建了表,这很好,但是列并没有我所期望的那样:
name, isElement, monsterType_name, monsterType_name1, monsterType_name2
但这并不像错误那么重要。没有数据加载到表中,它是空的
我做错了什么?一些基本的东西?我遇到什么可怕的事情了吗?有更好的方法吗?当你想要自定义列名时,你必须告诉他们列名,你可以按如下方法来做
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<MonsterType>()
.HasRequired(t => t.DefendAgainst)
.WithMany()
.Map(configuration => configuration.MapKey("DefendAgainst"));
modelBuilder.Entity<MonsterType>()
.HasRequired(t => t.ImmuneTo)
.WithMany()
.Map(configuration => configuration.MapKey("ImmuneTo"));
modelBuilder.Entity<MonsterType>()
.HasRequired(t => t.WeakTo)
.WithMany()
.Map(configuration => configuration.MapKey("WeakTo"));
base.OnModelCreating(modelBuilder);
}
希望我已经正确地理解了这一点 首先设计数据库,然后设计代码模型,可以极大地改进体系结构。很难看出代码模型应该如何映射到数据库结构。(并非所有型号都可以)@SamAxe我想你是对的-我现在先做4张桌子。一个用于保存名称和isElement,三个用于描述与FKs的weakTo、Defensed和immuneTo关系,返回到第一个表。我已经修改了代码,将继续设计数据库,然后相应地填充数据。我将尝试另找时间学习更多关于实体框架的知识(我觉得我已经学了一些)
using (var theDB = new monsterDataContext())
{
foreach (monsterType ty in realTypes)
{
theDB.Types.Add(ty);
}
theDB.SaveChanges();
}
name, isElement, monsterType_name, monsterType_name1, monsterType_name2
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<MonsterType>()
.HasRequired(t => t.DefendAgainst)
.WithMany()
.Map(configuration => configuration.MapKey("DefendAgainst"));
modelBuilder.Entity<MonsterType>()
.HasRequired(t => t.ImmuneTo)
.WithMany()
.Map(configuration => configuration.MapKey("ImmuneTo"));
modelBuilder.Entity<MonsterType>()
.HasRequired(t => t.WeakTo)
.WithMany()
.Map(configuration => configuration.MapKey("WeakTo"));
base.OnModelCreating(modelBuilder);
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<MonsterType>()
.HasOptional(t => t.DefendAgainst)
.WithMany()
.Map(configuration => configuration.MapKey("DefendAgainst"));
modelBuilder.Entity<MonsterType>()
.HasOptional(t => t.ImmuneTo)
.WithMany()
.Map(configuration => configuration.MapKey("ImmuneTo"));
modelBuilder.Entity<MonsterType>()
.HasOptional(t => t.WeakTo)
.WithMany()
.Map(configuration => configuration.MapKey("WeakTo"));
base.OnModelCreating(modelBuilder);
}
create table [dbo].[MonsterTypes] (
[Name] [nvarchar](128) not null,
[IsElement] [bit] not null,
[DefendAgainst] [nvarchar](128) null,
[ImmuneTo] [nvarchar](128) null,
[WeakTo] [nvarchar](128) null,
primary key ([Name])
);
alter table [dbo].[MonsterTypes] add constraint [MonsterType_DefendAgainst] foreign key ([DefendAgainst]) references [dbo].[MonsterTypes]([Name]);
alter table [dbo].[MonsterTypes] add constraint [MonsterType_ImmuneTo] foreign key ([ImmuneTo]) references [dbo].[MonsterTypes]([Name]);
alter table [dbo].[MonsterTypes] add constraint [MonsterType_WeakTo] foreign key ([WeakTo]) references [dbo].[MonsterTypes]([Name]);