В Entity Framework Code First я не могу иметь свойство навигации на зависимом объекте - PullRequest
0 голосов
/ 16 марта 2012

Предположим следующую схему

class Person{
  public int Id {get;set;}
  public virtual ICollection<Province> Provinces {get;set;}
}

class Province{
 public int Id {get;set;}
 public virtual ICollection<Person> Residents {get;set;}
}

Могу ли я в любом случае скрыть или не определить свойство Residents? Это не имеет смысла в контексте приложения, и мне кажется, что я делаю уступку в DTO, чтобы соответствовать схеме Code First. то есть я не хочу иметь возможность получать людей из провинции. В обычном EF с DBML я мог бы удалить свойство навигации, чтобы добиться этого.

Я просмотрел документацию по fluentAPI и не могу найти ничего, что могло бы охватить ситуацию.

В идеальном мире я должен сопоставить DTO Entity POCO с классом домена, но мне просто лень и я вижу, можно ли этого избежать.

[править] Мне удалось решить с этим, но EF, что вы сделали с моим бедным poco !!

  class Province{
     public int Id {get;set;}
     protected virtual ICollection<Person> Residents {get;set;}

     internal class ProvinceMapping : EntityConfiguration<Province>
     {
          public ProvinceMapping()
          {
              HasMany(p => p.Residents);
          }
     }

Тогда в контексте

protect void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Configuration.Add(new Province.ProvinceMapping());
}

1 Ответ

1 голос
/ 16 марта 2012

Вы можете создать отображение только с одним свойством навигации:

class Person
{
    public int Id {get;set;}
    public virtual ICollection<Province> Provinces {get;set;}
}

class Province
{
    public int Id {get;set;}
}

public class PersonMapping : EntityConfiguration<Person>
{
     public PersonMapping()
     {
         this.HasMany(p => p.Provinces)
             .WithMany()
             .Map(m =>
             {
                 m.MapLeftKey("PersonId");
                 m.MapRightKey("ProvinceId");
                 m.ToTable("PersonProvinces");
             });
     }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Configuration.Add(new PersonMapping());
}

Использование WithMany() без параметра является ключом здесь.Он сообщает EF, что отношение «многие ко многим», но один конец не отображается как коллекция навигации в модели.

...