2017-02-05 11 views
0

У меня есть два POCO Entity классыВопросы Mapping EF Multiple Однотипные Отношения

public class Model 
{ 
    public long Id { get; set; } 

    public string Name { get; set; } 
    public string Description { get; set; } 


    // Relationships  
    public virtual ICollection<Shoot> PhotoSets { get; set; } 
    public virtual ICollection<Shoot> FilmSets { get; set; } 

} 

public class Shoot 
{ 
    public long Id { get; set; } 

    public string Name { get; set; } 
    public string Description { get; set; } 
    public string ShootType { get; set; } 

    // Relationships 
    public long ModelId { get; set; } 
    public virtual Model Model { get; set; } 

} 

Так что я хочу только одну таблицу с несколькими типами dfined по ICollection навигационных свойств на модели. Если я позволю EF генерировать по соглашению, он создает Model_dId как дополнительное свойство, которое я хочу избежать. В моем Fluent класса отображения ModelConfiguration Я попытался это:

this.HasMany(m => m.FilmSets) 
    .WithRequired(sh => sh.Model) 
    .HasForeignKey(sh => sh.ModelId); 

this.HasMany(m => m.PhotoSets) 
    .WithRequired(sh => sh.Model) 
    .HasForeignKey(sh => sh.ModelId); 

и получить Additional information: Schema specified is not valid. Errors: The relationship 'PronHunter.Database.Model_FilmSets' was not loaded because the type 'PronHunter.Database.Shoot' is not available.

Я пытался от ShootConfiguration определения обоих путей с:

this.HasRequired(sh => sh.Model) 
    .WithMany(m => m.PhotoSets) 
    .HasForeignKey(sh => sh.ModelId); 

this.HasRequired(sh => sh.Model) 
    .WithMany(m => m.FilmSets) 
    .HasForeignKey(sh => sh.ModelId); 

, который создает базу данных при запросе в первый раз, но он по-прежнему генерирует дополнительный столбец Model_Id. На самом деле я также попробовал переименовать ModelId в ModelaaaId, но потом я столкнулся с тремя столбцами ModelaaaId, ModelId и Model_id, поэтому EF игнорирует мое явное именование в любом случае.

Так что я чувствую, что это много-много сценарий, но я пробовал следовать некоторым примерам, но я не вижу MapLeftColumn в любом intellisense, и в любом случае это не слишком много для многих сценариев. Это два человека, которого я хочу определить, как если бы я определил два внутренних объединения в T-SQL.

Кто-нибудь знает, как я должен это делать?

+0

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

ответ

0

Это выглядит так, как будто вы все готово, чтобы использовать TPH с ShootType как ваш дискриминатора - получить два новых типа (например FilmSet и PhotoSet) из Shoot затем настроить дискриминатор ShootType, как описано в this MSDN article. Вы бы затем использовать эти типы для двух различных коллекций:

public class FilmSet : Shoot {} 
public class PhotoSet : Shoot {} 

// DbContext model configuraiton 
modelBuilder.Entity<Shoot>() 
    .Map<FilmSet>(m => m.Requires("ShootType").HasValue("Film Set")) 
    .Map<PhotoSet>(m => m.Requires("ShootType").HasValue("Photo Set")); 

public class Model 
{ 
    public virtual ICollection<FilmSet> FilmSets { get; set; } 
    public virtual IColelction<PhotoSet> PhotoSets { get; set; } 
} 

В качестве альтернативы, вы можете создать два неотображённых свойства для фильтрации один отображенной коллекции. Однако вам нужно использовать только одну сопоставленную коллекцию для операций добавления/удаления:

public virtual ICollection<Shoot> Shoots { get; set; } 
[NotMapped] 
public IEnumerable<Shoot> PhotoSets { 
    get { return Shoots?.Where(s => s.ShootType == "Photo Set"); } 
} 
public IEnumerable<Shoot> FilmSets { 
    get { return Shoots?.Where(s => s.ShootType == "Film Set"); } 
} 
+0

Спасибо за ответ. GIven, что мои два подтипа на самом деле идентичны, - это единственный путь для TPH? –

+0

Это единственный раз, когда можно использовать TPH, не нарушая 3NF! Вы можете создать два неотображаемых свойства, которые фильтруют одну сопоставленную коллекцию, но вы должны использовать эту единую коллекцию для операций добавления/удаления. – Moho

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

  • Нет связанных вопросов^_^