Да, он не будет хранить информацию о теге для одной из книг, потому что ваш экземпляр тега может быть связан только с одной книгой.Это потребовало бы вашего отношения «многие ко многим» между Book
и Tag
, но ваше отношение «один ко многим».Отношение между Pen
и Tag
также один-ко-многим.Это ясно видно по внешним ключам в таблице Tag
.
Проблема в том, что ICollection<ITaggable> Items
сначала пропускается кодом EF - сначала код не работает с интерфейсами.Вы должны определить свой тег как:
public class Tag
{
[DatabaseGenerated(DatabaseGenerationOption.Identity)]
public Guid TagId { get; set; }
public string Name { get; set; }
public virtual ICollection<Book> Books { get; set; }
public virtual ICollection<Pen> Pens { get; set; }
}
Это отобразит многие ко многим между Book
и Tag
и многие ко многим между Pen
и Tag
.Если вы также хотите собрать ITaggable
, вы можете выставить другое свойство, объединяющее Books
и Pens
.
Если вы действительно хотите, чтобы отношение «один ко многим», вы не можете ожидать, что тег будет связан скниги и в этом случае ваша сущность Tag
должна выглядеть следующим образом:
public class Tag
{
[DatabaseGenerated(DatabaseGenerationOption.Identity)]
public Guid TagId { get; set; }
public string Name { get; set; }
public virtual Book Book { get; set; }
public virtual Pen Pen { get; set; }
}
Снова вы можете создать Items
как вычисляемое свойство.Любая комбинация отношений должна быть очевидна из этих примеров.
Редактировать:
Если вы не хотите предоставлять свойства навигации в теге, вы должны использовать fluent-api:
public class Context : DbContext
{
public DbSet<Book> Books { get; set; }
public DbSet<Pen> Pens { get; set; }
public DbSet<Tag> Tags { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Book>()
.HasMany(b => b.Tags)
.WithMany();
modelBuilder.Entity<Pen>()
.HasMany(p => p.Tags)
.WithMany();
}
}
Дополнительную справку по API можно найти в блоге команды ADO.NET , но это не относится к данным (это для CTP5).