2012-03-15 147 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

相关问题