2013-11-09 3 views
0

У меня есть относительно сложные отношения, которые мне нужно настроить между объектом User и множеством таблиц поиска. Объект пользователя Ваш пробег пользовательской модели мельницы:Как создать сложное много-много отношений в сущности Framework 4 сначала код

public class Youth : IAuditInfo 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    public Guid YouthGuid { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public Address Address { get; set; } 
    public DateTime CreatedDate { get; set; } 
    public DateTime ModifiedDate { get; set; } 
    public string ImageName { get; set; } 
    [ForeignKey("FkYouthId")] 
    public ICollection<User> Parents { get; set; } 
    public CubPack Pack { get; set; } 
    public virtual ICollection<RequirementsLog> RequirementsLogs { get; set; } 
    public Youth() 
    { 
     Parents = new List<User>(); 
    } 
} 

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

Мастер:

public class BearTrail 
{ 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<BearTrailRequiredBadge> BearTrailRequiredBadges { get; set; } 
    public virtual ICollection<BearTrailElectiveBadge> BearTrailElectivedBadges { get; set; } 
} 

Необходимые Значки:

public class BearTrailRequiredBadge 
{ 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int Number { get; set; } 
    public string Description { get; set; } 
    public virtual ICollection<BearTrailRequiredBadgeSubRequirement> BearTrailRequiredBadgeSubRequirements { get; set; } 
} 

Обязательный знак требование к югу:

public class BearTrailRequiredBadgeSubRequirement 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    public string Number { get; set; } 
    public string Text { get; set; } 
    public bool Required { get; set; } 
} 

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

Я изначально думал при использовании моей модели RequirementLog, чтобы связать его:

public class RequirementsLog 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    public virtual ICollection<Youth> Youth { get; set; } 
    public BearTrail BearTrailRequirements { get; set; } 
    public TigerTrail TigerTrailRequirements { get; set; } 
    public WolfTrail WolfTrailRequirements { get; set; } 
    public WebelosTrail WebelosTrailRequirements { get; set; } 
    public WebelosArrowOfLight WebelosArrowOfLightRequirements { get; set; } 
} 

Так что есть многие ко многим между RequirementsLog и молодежью. В таблице, созданной из RequirementsLog, есть один столбец PK (ID) и столбцы FK для каждого свойства. Многие из многих таблиц, созданных из этого (RequirementsLogYouths), имеют две PK (RequirementsLogId и YouthId).

Я собираюсь сделать это правильно? Конечная цель состоит в том, чтобы иметь 16 или около того сервер таблиц как список списков различных требований и иметь другую таблицу (ы), чтобы отслеживать прогресс определенных юношей в соответствии с требованиями. Мне нелегко визуализировать некоторые из этих материалов DBA, поэтому любой вход был бы весьма полезен.

ответ

1
protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
    modelBuilder.Entity<Entity1>() 
     .HasMany(b => b.Entities2) 
     .WithMany(p => p.Entities1) 
     .Map(m => 
     { 
      m.ToTable("Entitie1Entity2"); 
      m.MapLeftKey("Entity1Id"); 
      m.MapRightKey("Entity2Id"); 
     });    
    } 
+0

Вопрос по этому вопросу, если бы вы могли разработать немного. Я знаком с быстрым api и делаю выше, чтобы дать таблицу m2m между двумя типами сущностей. Итак, с этим предлагаемым решением, могу ли я сделать это для 4-6 «основных» таблиц, которые у меня есть, или для всех 16 таблиц? Итак, повторите фрагмент выше для каждой привязки, в которой я нуждаюсь? Как это дает мне способ иметь столбцы для маркировки элементов как завершенных и т. Д.? – ledgeJumper

+0

Как вы описали, вам нужно многого для многих только для RequirementsLog и Youth, как вы сами сказали. Все ваши «значки» ваших значков должны иметь fk для своих родителей. RequirementsLog будет поддерживать ссылки на поиски для конкретной молодежи. Теперь я не понимаю, почему у вас много молодежи для одного требованияLog? – dblk1965

2

В большинстве случаев требования «log» должны быть в одном (люди) ко многим (журналу).

За исключением ... Один занесенный элемент предназначен для многих детей ... Если это так, вам нужна третья таблица, которая отображает много людей на несколько зарегистрированных событий. То есть, если это действительно много для многих. В общем, эта ситуация почти всегда требует третьей, промежуточной таблицы сопоставления. Прочитайте немного по многим или многим проектам, и вы быстро это увидите и насколько это просто.

+0

Я ценю вход. На самом деле я закончил с чем-то похожим на этот подход. – ledgeJumper

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