2012-03-15 196 views
1

任何人都可以幫助我使用EF 4.3定義關係映射。當我試圖在代碼中模擬它們時,我有點失落映射模型實體框架4代碼優先

邏輯在這裏。

  1. 一個城市有1個或多個位置(例如1區,CBD,南,北)
  2. 一個位置具有0個或多個場地
  3. 一個地點可以屬於1個地點(如紐約CBD或如果城市很小且沒有任何位置(例如夏威夷),則屬於1個城市,並且1個所有者
  4. 顯示城市中的場地數目。如果一個城市有位置,則顯示no。所有地點的所有場館都屬於城市。否則,僅顯示不屬於該城市的場地。

這裏是我的模型

public class City 
{ 
    private ICollection<Location> _locations; 
    private ICollection<Venue> _venues; 

    public virtual int ID { get; set; } 
    public virtual string Name { get; set; } 

    public virtual ICollection<Location> Locations 
    { 
     get { return _locations ?? (_locations = new List<Location>()); } 
     protected set { _locations = value; } 
    } 

    public virtual ICollection<Venue> Venues 
    { 
     get { return _venues ?? (_venues = new List<Venue>()); } 
     protected set { _venues = value; } 
    } 
} 

public class Location 
{ 
    private ICollection<Venue> _venues; 

    public virtual int ID {get;set;} 
    public virtual string Name { get; set; } 

    public virtual int CityID{get;set;} 
    public virtual City City {get;set;} 

    public virtual ICollection<Venue> Venues 
    { 
     get { return _venues ?? (_venues = new List<Venue>()); } 
     protected set { _venues = value; } 
    } 
} 

public class Owner 
{ 
    public virtual int ID {get;set;} 
    public virtual string Name { get; set; } 

    public virtual int VenueID {get;set;} 
    public virtual Venue Venue {get;set;} 
} 

public class Venue 
{ 
    public virtual int ID {get;set;} 
    public virtual string Name { get; set; } 

    public virtual int LocationID {get;set;} 
    public virtual Location VenueLocation {get;set;} 

    public virtual int VenueCityID{get;set;} 
    public virtual City VenueCity {get;set;} 

    public virtual int VenueOwnerID{get;set;} 
    public virtual Owner VenueOwner {get;set;} 
} 

我試圖映射的模式,而是試圖映射位置,城市和地點的時候非常混亂

public class Context : DbContext 
{ 
    public DbSet<City> City{ get; set; } 
    public DbSet<Locations> Locations{ get; set; } 
    public DbSet<Owner> Owners{ get; set; } 
    public DbSet<Venue> Venues{ get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Location>() 
      .HasRequired(loc => loc.City) 
       .WithMany(c => c.Locations) 
       .HasForeignKey(loc => loc.CityID); 

     modelBuilder.Entity<Venue>() 
      .HasRequired(v => v.VenueOwner) 
      .WithRequiredPrincipal(); 

     //confusing here when trying to map Location & City for this venue 
     modelBuilder.Entity<Venue>() 
      .HasRequired(v => v.Location) 
      .WithRequiredPrincipal(); 

     modelBuilder.Entity<Venue>() 
      .HasRequired(v => v.City) 
      .WithRequiredPrincipal(); 
    } 
} 

回答

0

你可能會發現它更簡單,如果你只要堅持你在第一點和第二點的陳述。那麼一個小城市就會有一個地點集合,但只有一個入口。

此外,您的位置將有一個場館的collectino,場地將只屬於業主和地點。

然後你必須:

public class City 
{ 
    private ICollection<Location> _locations; 

    public virtual int ID { get; set; } 
    public virtual string Name { get; set; } 

    public virtual ICollection<Location> Locations 
    { 
     get { return _locations ?? (_locations = new List<Location>()); } 
     protected set { _locations = value; } 
    } 
} 

public class Location 
{ 
    private ICollection<Venue> _venues; 

    public virtual int ID {get;set;} 
    public virtual string Name { get; set; } 

    public virtual City City {get;set;} 

    public virtual ICollection<Venue> Venues 
    { 
     get { return _venues ?? (_venues = new List<Venue>()); } 
     protected set { _venues = value; } 
    } 
} 

public class Owner 
{ 
    public virtual int ID {get;set;} 
    public virtual string Name { get; set; } 

    public virtual int VenueID {get;set;} 
    public virtual Venue Venue {get;set;} 
} 

public class Venue 
{ 
    public virtual int ID {get;set;} 
    public virtual string Name { get; set; } 

    public virtual Location VenueLocation {get;set;} 

    public virtual Owner VenueOwner {get;set;} 
} 

在一個城市的所有場館查詢會再像:

city.Locations.SelectMany(l => l.Venues); 
+0

我知道這簡單,如果市僅包含位置的集合,但是如果我想要得到所有小城市的場地例如夏威夷,當小城市根本沒有任何位置時,我怎麼能做這個查詢 – 2012-03-15 01:48:47

+0

讓城市至少有一個位置。一個小城市將擁有一個包含該城市所有場館的位置。通過這種方式,您可以使用相同的代碼處理大城市和小城市。 – 2012-03-15 02:15:15

+0

你如何映射模型,使城市至少有一個位置?其實我仍然不相信這種方法,即我必須定義城市,然後定義城市的位置,例如新南威爾士州奧爾伯裏鎮和阿爾伯裏的位置? – 2012-03-15 02:25:12

相關問題