2011-02-15 107 views
3

我試圖通過DbModel映射數據庫中存在的這種關係。實體框架的DbModel:如何使用連接表映射一對多關係?

CREATE TABLE core.Institutes 
(
    ID INT NOT NULL PRIMARY KEY IDENTITY(1,1), 
    Name NVARCHAR(128) NOT NULL, 
    OldID INT NULL 
) 
GO 

CREATE TABLE core.InstitutePlaces 
(
    FKInstituteID INT NOT NULL PRIMARY KEY REFERENCES core.Institutes(ID), 
    FKPlaceID INT NOT NULL REFERENCES core.Places(ID) 
) 
GO 

CREATE TABLE core.Places 
(
    ID INT NOT NULL PRIMARY KEY IDENTITY(1,1), 
    Name NVARCHAR(128) NOT NULL, 
    FKParentID INT NULL REFERENCES core.Places(ID), 
    OldID INT NULL 
) 
GO 
這個模型

public class Place 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int? ParentId { get; set; } 
    public Place Parent { get; set; } 
} 

public class Institute 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public Place Place { get; set; } 
} 

我們使用這樣的事情做的映射

modelBuilder.Entity<Institutes.Institute>().HasOptional(i => i.Place); 

,但它不工作:(

此方案完全由EDML文件管理,所以問題只是關於映射。

+1

我相信你的模型爲1 to *工作,導航屬性需要是ICollection 研究所{get;設置;},啓用延遲加載,使屬性虛擬。這裏有一篇關於EFCF CPT5的好博客http://weblogs.asp.net/manavi/default.aspx – Paul 2011-02-15 18:10:47

+0

謝謝,但我們希望避免從地方到學院有一個導航屬性,因爲它對我們來說沒有任何意義從一個地方轉到其研究所或與該特定地點相關的其他實體。 – Kralizek 2011-02-16 09:57:32

回答

3

這樣的事情會給你(幾乎)所需的模式帶來一個警告:Code First不會在實體分割場景中創建1:1關係,而您希望的模式(使用連接表創建1:*關聯)是它的一個特例。

public class Place 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int? ParentId { get; set; } 
    public Place Parent { get; set; } 
} 

public class Institute 
{ 
    [DatabaseGenerated(DatabaseGenerationOption.None)] 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public int? PlaceId { get; set; } 
    public Place Place { get; set; } 
} 

public class Context : DbContext 
{ 
    public DbSet<Place> Places { get; set; } 
    public DbSet<Institute> Institutes { get; set; } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Institute>().Map(mc => 
     { 
      mc.Properties(p => new { p.Id, p.Name }); 
      mc.ToTable("Institutes"); 
     }) 
     .Map(mc => 
     { 
      mc.Properties(p => new { p.Id, p.PlaceId }); 
      mc.ToTable("InstitutePlaces"); 
     }); 

     modelBuilder.Entity<Place>() 
        .HasOptional(p => p.Parent) 
        .WithMany() 
        .HasForeignKey(p => p.ParentId); 
    } 
} 

由於我解釋了here的錯誤,我不得不關閉身份生成。