2014-12-30 10 views
0

Я хотел бы создать ресурс и RelatedResources таблицу с EF Code First, как показано ниже:просмотра таблицы с EF Codefirst

Table Resource 
int Id 
string ResourceName 
int Category 

Table RelatedResource 
int ResourceId 
int RelatedResourceId 

Я попытался, как показано ниже, но Ошибка: ForeignKeyAttribute на собственность «RESOURCEID» от типа «Models .ResourceRelated 'недействителен. Свойство навигации «Ресурс» не было найдено на зависимом типе «Models.ResourceRelated». Значение Name должно быть допустимым именем свойства навигации.

public class ResourceRelated 
    { 
     [ForeignKey("Resource")] 
     public int ResourceId { get; set; } 
     public virtual Resource Resoure { get; set; } 
     public virtual ICollection<Resource> RelatedResource { get; set; } 
    } 

Прошу совета!

ответ

0

Если вы хотите, чтобы связанная таблица Resource, чем вы хотите отношения «многие ко многим». Вы можете добиться этого в следующем пути

public class Resource 
{ 
    public int ResourceId { get; set; } 
    public string ResourceName { get; set; } 
    public int Category { get; set; } 

    [InverseProperty("Resoure")] 
    public virtual ICollection<RelatedResource> RelatedResource { get; set; } 
    [InverseProperty("ResourceRelated")] 
    public virtual ICollection<RelatedResource> ResourceRelated { get; set; } 
} 

public class RelatedResource 
{ 
    [Key] 
    [Column(Order = 1)] 
    [ForeignKey("Resoure")] 
    public int ResourceId { get; set; } 
    [Key] 
    [Column(Order = 2)] 
    [ForeignKey("ResourceRelated")] 
    public int ResourceRelatedId { get; set; } 

    public virtual Resource Resoure { get; set; } 
    public virtual Resource ResourceRelated { get; set; } 
} 

Если вы предпочитаете не работать с RelatedResource в коде, чем вы можете сделать следующий

public class Resource 
{ 
    public int ResourceId { get; set; } 
    public string ResourceName { get; set; } 
    public int Category { get; set; } 
    public virtual ICollection<Resource> RelatedResource { get; set; } 
    public virtual ICollection<Resource> ResourceRelated { get; set; } 
} 

После нужно следующая дополнительная конфигурация

internal class ResourceConfiguration : EntityTypeConfiguration<Resource> 
{ 
    public ResourceConfiguration() 
    { 
     HasMany(s => s.ResourceRelated).WithMany(c => c.RelatedResource) 
      .Map(cs => { 
       cs.MapLeftKey("ResourceId"); 
       cs.MapRightKey("RelatedResourceId"); 
       cs.ToTable("RelatedResource"); } 
      ); 
    } 
} 

И, наконец, добавьте эту конфигурацию

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    ///other configuration code 
    modelBuilder.Configurations.Add(new ResourceConfiguration()); 
} 

Но если вы хотите иметь «дерево ресурсов», чем вам не нужно RelatedResource таблицу

public class Resource 
{ 
    public int ResourceId { get; set; } 
    public string ResourceName { get; set; } 
    public int Category { get; set; } 
    public int? ResourceRelatedId { get; set; } 

    public Resource ResourceRelated { get; set; } 
    [ForeignKey("ResourceRelatedId")] 
    public virtual ICollection<Resource> RelatedResource { get; set; } 
} 
+0

Я хотел бы получить: Select * от dbo.ResourceDetails Где ResourceId в (Выбрать rr.RelatedResourceId от DBO. ResourceDetails rd Inner Join dbo.RelatedResource rr На rd.ResourceId = rr.ResourceId rd.id = 1 –

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