簡體   English   中英

EF Code First 多對多不工作

[英]EF Code First Many-to-Many not working

使用 Entity Framework Code First 范例,我將以下對象和關系定義為 ASP.Net MVC3 應用程序的一部分。 問題是 Photo 和 Gallery 對象之間的多對多關系無法正常工作。

目前,一個畫廊可以包含許多照片 - 這是正確的。 但是一張照片只能與一個畫廊相關聯——這是不正確的。 我希望一張照片能夠出現在許多畫廊中。 如果我在已與另一個畫廊關聯的情況下將照片添加到畫廊,則會將其從另一個畫廊中刪除。

我非常感謝您就如何使這種多對多關系發揮作用的解決方案。

這是我的代碼:

public class Photo
{
    public int ID { get; set; }
    public string Title { get; set; }
    public virtual ICollection<Gallery> Galleries { get; set; }
}

public class Gallery
{
    public int ID { get; set; }
    public string Title { get; set; }
    public virtual ICollection<Photo> Photos { get; set; }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    /* I would expect the following to cause a lookup table to 
     *  be created but it isnt */
    modelBuilder.Entity<Photo>().HasMany<Gallery>(p => p.Galleries);
    modelBuilder.Entity<Gallery>().HasMany<Photo>(g => g.Photos);
}

我在我自己的自定義數據庫初始化程序中使用以下代碼。

public void InitializeDatabase(PhotoDBContext context)
{
    var dbCreationScript = ((IObjectContextAdapter)context).ObjectContext.CreateDatabaseScript();
    Log(dbCreationScript);
    context.Database.ExecuteSqlCommand(dbCreationScript);
}

通過記錄 dbCreationScript 變量,我可以看到為這些表生成的相關 sql 如下。

create table [dbo].[Galleries] (
    [ID] [int] not null identity,
    [Title] [nvarchar](max) null,
    [Photo_ID] [int] null,
    primary key ([ID])
);

create table [dbo].[Photos] (
    [ID] [int] not null identity,
    [Title] [nvarchar](max) null,
    [Gallery_ID] [int] null,
    primary key ([ID])
);

alter table [dbo].[Photos] add constraint [Gallery_Photos] foreign key ([Gallery_ID]) references [dbo].[Galleries]([ID]);
alter table [dbo].[Galleries] add constraint [Photo_Galleries] foreign key ([Photo_ID]) references [dbo].[Photos]([ID]);

如您所見,沒有生成 SQL 來創建查找表,這可能是關系不起作用的原因 - 為什么不創建查找表?

我相信你需要使用這樣的東西:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
        modelBuilder.Entity<Photo>()
            .HasMany<Gallery>(x => x.Galleries)
            .WithMany(x => x.Photos)
            .Map(x =>
            {
                x.MapLeftKey("ID");
                x.MapRightKey("ID");
                x.ToTable("GalleryPhotos");
            });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM