【问题标题】:Mapping Model Entity Framework 4 Code First映射模型实体框架 4 代码优先
【发布时间】:2012-03-15 00:35:37
【问题描述】:

谁能帮我定义使用 EF 4.3 的关系映射。尝试先在代码中对其进行建模时,我有点迷茫

逻辑在这里。

  1. 一个城市有 1 个或多个位置(例如 1 区、CBD、南、北)
  2. 一个位置有 0 个或多个场地
  3. 场地可能属于 1 个地点(例如纽约 CBD 或纽约南部),或者如果城市较小且没有任何地点(例如夏威夷)和 1 个所有者,则属于 1 个城市
  4. 显示市内场馆编号。如果一个城市有位置,则显示没有。所有地点的所有场地都属于城市。否则显示场馆数量仅属于该城市。

这是我的模型

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;}
}

我尝试映射这些模型,但在尝试映射 Location、City 和 Venue 时非常混乱

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();
    }
}

【问题讨论】:

    标签: c# frameworks entity


    【解决方案1】:

    如果您只坚持第 1 点和第 2 点中的陈述,您可能会发现它更简单。然后一个小城市将有一个位置集合,但只有一个条目。

    此外,您的位置将有一个场馆集合,场馆将仅属于所有者和位置。

    那么你会有:

    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);
    

    【讨论】:

    • 我知道如果 City 只包含 Locations 的集合会更简单,但是如果我想获得小城市的所有场所,例如夏威夷,小城市根本没有位置怎么查询
    • 让一个城市必须至少有一个位置。一个小城市将有一个位置,其中包含该城市的所有场馆。这样您就可以使用相同的代码处理大小城市。
    • 如何映射模型以使城市至少有一个位置?实际上我仍然不能说服这种方法,即我必须定义城市然后城市的位置,例如新南威尔士州的奥尔伯里镇和奥尔伯里的位置?
    • 是的,没错。我知道它看起来有点多余,但它使您的其余代码更简单。映射只需建立表之间的关系,以便一个城市有许多位置。一个城市实际拥有的位置数量在您的代码中设置。
    猜你喜欢
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    • 2011-04-21
    相关资源
    最近更新 更多