2016-01-04 3 views
2

Заранее благодарим вас за помощь.Самостоятельная структура фреймворка сущности

Я пытаюсь создать базу данных для небольшого числа 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; } 
} 

Я перевожу с JSON, выполнив:

 // set up the types references 
     foreach (typeJSON ty in typeListFromFile){ 
      monsterType realTypeReference = lookUpMonsterTypeFromJSONtype(ty, realTypes); 
      //convert those lists 
      ICollection<monsterType> mtWTs = ty.weakTo.Select(w => lookUpMonsterTypeFromName(w, realTypes)).ToList(); 
      ICollection<monsterType> mtDAs = ty.defendAgainst.Select(w => lookUpMonsterTypeFromName(w, realTypes)).ToList(); 
      ICollection<monsterType> mtITs = ty.immuneTo.Select(w => lookUpMonsterTypeFromName(w, realTypes)).ToList(); 
      //set them on the real type reference 
      realTypeReference.weakTo = mtWTs; 
      realTypeReference.defendAgainst = mtDAs; 
      realTypeReference.immuneTo = mtITs; 
     } 

Данные переходит в случаях of monsterType просто отлично. Я сижу довольно с 40 monsterTypes, и все они относятся друг к другу просто отлично.

Я использую этот проект, чтобы научить себя MVC и Entity Framework (с кодовым первым?), И хотя я играл с Flask в прошлом, я немного из воды здесь, на C# .net землю, пожалуйста, простите меня, если я упущу что-то совершенно очевидное.

Я установил соединение db с базой данных SQL Server, и он создает таблицу realTypes ОК ----, но она не содержит столбцов immunTo, weakTo и protectAgainst, которые я ожидал бы, и я думаю, это потому, что это все самореферентны.

Хорошо, так что я сделал контекст данных:

public class monsterDataContext : DbContext 
{ 
    public monsterDataContext() : base("name=blood") 
    { 
    } 

    public DbSet<monsterType> Types { get; set; } 
} 

И я просто пройдёмся по моему списку и сохранить изменения:

using (var theDB = new monsterDataContext()) 
    { 
     foreach (monsterType ty in realTypes) 
     { 
      theDB.Types.Add(ty); 
     } 
     theDB.SaveChanges(); 
    } 

Когда я делаю это, ошибки на theDB.SaveChanges () с:

Нарушение множественности. Роль 'monsterType_defendAgainst_Source' отношения 'ParseMonsterYaml.monsterType_defendAgainst' имеет множественность 1 или 0..1.

Я не совсем уверен, почему это проблема?

Он также создает таблицу, которая является большим, но колонны на самом деле нет, что я бы ожидать:

name, isElement, monsterType_name, monsterType_name1, monsterType_name2 

но это на самом деле не имеет значения, сколько ошибок. Никакие данные не загружаются в таблицу, они пусты.

Что я делаю неправильно? Что-то фундаментальное? Я сталкиваюсь с чем-то ужасным? Есть ли способ лучше?

+2

Проектирование вашей базы данных, прежде чем ваша модель кода, может значительно улучшить вашу архитектуру. Трудно понять, как ваша модель кода должна быть сопоставлена ​​структуре базы данных. (не все модели могут быть) –

+0

@SamAxe Я думаю, что вы правы. Сейчас я делаю 4 стола. Один для хранения имени и isElement и 3 для описания отношений weakTo, protectAgainst и immunTo с FK обратно в первую таблицу. Я изменил свой код и собираюсь продолжить разработку базы данных и затем соответствующим образом заполнить данные. Я попытаюсь найти другое время, чтобы узнать больше о Entity Framework (я чувствую, что я уже кое-что узнал) –

ответ

1

Если вы хотите указать имена столбцов, вы должны сообщить им имена EF, вы можете сделать это, как показано ниже.

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); 
     } 

Об ошибки, по умолчанию используется один-много столбцов отношений создаются NOT NULL, поэтому при сохранении с недостающими данными, это нарушает SQL ограничение. если DefendAgaint, WeekTo и ImmuneTo может быть пустым, то в приведенном выше коде замените .HasRequired с .HasOptional ниже

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); 
     } 

это создает этот SQL

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

Надежда Я понял это правильно!

Смежные вопросы