首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EntityFramework 6到许多项的关系映射

EntityFramework 6到许多项的关系映射
EN

Stack Overflow用户
提问于 2014-12-01 20:43:37
回答 1查看 41关注 0票数 1

我觉得我的映射应该被正确设置,但是当我从db上下文中检索一个项目时,它没有任何与它相关的“映射”项。

我要做的映射是:

顶级项目是“事件”。

一个事件有许多与它相关的"TimeSlot“。

一个TimeSlot有许多与它相关的字符串。

代码语言:javascript
复制
public class MyEvent
{
    private ICollection<TimeSlot> mTimeSlots;

    public virtual ICollection<TimeSlot> TimeSlots
    {
       get{return mTimeSlots ?? (mTimeSlots = new Collection<TimeSlot>());}
       set{mTimeSlots = value;}
    }

    [Key]
    public int Id {get;set;}
}

我的TimeSlot看起来是:

代码语言:javascript
复制
public class TimeSlot
{
    private ICollection<string> mItems;

    public virtual ICollection<string> Items
    {
        get { return mItems ?? (mItems = new Collection<string>()); }
        set { mItems = value; }
    }

    [Key]
    public virtual int Id { get; set; }

    public virtual string Label { get; set; }
}

我的DbContext看起来像:

代码语言:javascript
复制
public class MyEventsDataContext : DbContext
{
    public MyEventsDataContext()
        : base("MyEventsDatabase")
    {
        // Do nothing.
    }

    public DbSet<MyEvent> MyEvents { get; set; }
    public DbSet<TimeSlot> TimeSlots { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<MyEvent>()
            .HasMany<TimeSlot>(e => e.TimeSlots);
    }
}

为了测试目的,我正在迁移一些默认数据,如下所示:

代码语言:javascript
复制
    protected override void Seed(MyEventsDataContext context)
    {
        //  This method will be called after migrating to the latest version.

        var timeSlot1 = new TimeSlot {Label = "Slot 1"};
        timeSlot1.Items.Add("Do stuff 1");
        timeSlot1.Items.Add("Do stuff 2");
        timeSlot1.Items.Add("Do stuff 3");

        var timeSlot2 = new TimeSlot {Label = "Slot 2"};
        timeSlot2.Items.Add("Do stuff 1");
        timeSlot2.Items.Add("Do stuff 2");
        timeSlot2.Items.Add("Do stuff 3");

        var timeSlot3 = new TimeSlot {Label = "Slot 3"};
        timeSlot3.Items.Add("Do stuff 1");
        timeSlot3.Items.Add("Do stuff 2");
        timeSlot3.Items.Add("Do stuff 3");

        context.TimeSlots.AddOrUpdate(new[] {timeSlot1, timeSlot2, timeSlot3});

        var event1 = new MyEvent
        {
            Address = "123 Street Ln",
            CampaignId = "abc123",
            City = "City",
            CreatedDate = DateTime.Now,
            EventDate = DateTime.Now,
            EventType = "TradeShow",
            Name = "Show Name",
            ProductInterest = "MyArm",
            State = "State",
            Zipcode = "12345",
            TimeSlots = new Collection<TimeSlot> {timeSlot1, timeSlot2, timeSlot3}
        };
        context.MyEvents.AddOrUpdate(event1);

        var event2 = new MyEvent
        {
            Address = "321 Street Ln",
            CampaignId = "123abc",
            City = "City",
            CreatedDate = DateTime.Now,
            EventDate = DateTime.Now,
            EventType = "Conference",
            Name = "Show Name",
            ProductInterest = "MyArm",
            State = "State",
            Zipcode = "54321",
            TimeSlots = new Collection<TimeSlot> {timeSlot1, timeSlot2, timeSlot3}
        };
        context.MyEvents.AddOrUpdate(event2);
    }

在我的控制器中,当我从DbContext检索一个事件时,它没有附加的TimeSlots (它是空的)。

代码语言:javascript
复制
MyEvent show = mDb.MyEvents.Find(id);

这里的任何建议都将不胜感激。我可能只是没有正确地设置映射。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-01 21:06:37

你必须打开LazyLoading

代码语言:javascript
复制
public MyEventsDataContext()
    : base("MyEventsDatabase")
{
    this.Configuration.LazyLoadingEnabled = true;
}

或者你应该把财产包括进去。

代码语言:javascript
复制
mDb.MyEvents.Include("TimeSlots").Find(id)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27236934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档