Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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#_Json_Entity Framework - Fatal编程技术网

C# 自引用实体框架模型

C# 自引用实体框架模型,c#,json,entity-framework,C#,Json,Entity Framework,提前感谢你的帮助 我正试图和一个朋友为一个小型rpg制作一个数据库。到目前为止,我们一直在跟踪JSON文件中的攻击类型(我的朋友不懂技术,所以我们早期仅在纯文本文件上妥协)。我想让他成为一个网站,这样他就可以更容易地编辑我们想法之间的关系(类型、怪物种类、可能的攻击等) 因此,我从中提取的数据如下所示: { "name": "water", "isElement": true, "defendAgainst": [ "fire", "unde

提前感谢你的帮助

我正试图和一个朋友为一个小型rpg制作一个数据库。到目前为止,我们一直在跟踪JSON文件中的攻击类型(我的朋友不懂技术,所以我们早期仅在纯文本文件上妥协)。我想让他成为一个网站,这样他就可以更容易地编辑我们想法之间的关系(类型、怪物种类、可能的攻击等)

因此,我从中提取的数据如下所示:

{
    "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]);