簡體   English   中英

如何使用 EF6 正確設置多對多關系?

[英]How to set up many to many relationship correctly with EF6?

我在讓我的多對多關系正常工作方面遇到了一些問題。 我有兩個表,Beestje 和 Accessoire,我想顯示其內容。

這是我的桌子:Beestje:

public class Beestje
{
    public Beestje()
    {
        this.Accessoires = new HashSet<Accessoire>();
    }

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

    public String Naam { get; set; }

    public String Type { get; set; }

    public int Prijs { get; set; }

    public String Afbeelding { get; set; }

    public virtual ICollection<Accessoire> Accessoires { get; set; }
}

配件:

public class Accessoire
{
    public Accessoire()
    {
        this.Beestjes = new HashSet<Beestje>();
    }

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

    public String Naam { get; set; }

    public double Prijs { get; set; }

    public String Afbeelding { get; set; }

    public virtual ICollection<Beestje> Beestjes { get; set; }
}

在我的控制器中,我從 Beestje 表中檢索內容並將其返回到視圖:

public ActionResult Beestjes()
    {
        ViewBag.Message = "Your application beestjes page";

        List<Beestje> beestjes;

        using (var context = new MyContext())
        {
            beestjes = context.Beestjes.ToList();

            return View(beestjes);
        }
    }

當我這樣打印時沒有問題:

@model IEnumerable<BeestjeOpJeFeestje.Models.Beestje>

<h2>@ViewBag.Message</h2>
<ul>
    @foreach (var a in Model)
    {
        <li>@a.Naam</li>
    }
</ul>

但是當我這樣打印時,我得到了一個錯誤:

@model IEnumerable<BeestjeOpJeFeestje.Models.Beestje>

<h2>@ViewBag.Message</h2>
<ul>
    @foreach (var a in Model)
    {
        <li>@a.Naam</li>
        foreach (var b in a.Accessoires)
        {
            <li>@b.Naam</li>
        }
    }
</ul>

在我稱之為 a.Accessoires 的部分出錯了。 錯誤是:“System.ObjectDisposedException:‘ObjectContext 實例已被釋放,不能再用於需要連接的操作。’”

有人知道正確的方法,願意為我提供正確的代碼,或給我一些指導嗎?

提前致謝。

編輯:

MyContext

public class MyContext : DbContext
    {
        public MyContext() : base("name=Local")
        {
            Database.SetInitializer(new MyContextInitializer());
        }

        public DbSet<Beestje> Beestjes { get; set; }
        public DbSet<Accessoire> Accessoires { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
        }
    }

MyContextInitializer

public class MyContextInitializer : DropCreateDatabaseAlways<MyContext>
    {
        protected override void Seed(MyContext context)
        {
            base.Seed(context);

            context.Beestjes.Add(new Beestje() { Id = 1, Naam = "Aap", Type = "Jungle", Prijs = 150, Afbeelding = "Content/images/aap.png" });
            context.Beestjes.Add(new Beestje() { Id = 2, Naam = "Olifant", Type = "Jungle", Prijs = 250, Afbeelding = "Content/images/olifant.png" });
            context.Beestjes.Add(new Beestje() { Id = 3, Naam = "Zebra", Type = "Jungle", Prijs = 200, Afbeelding = "Content/images/zebra.png" });
            context.Beestjes.Add(new Beestje() { Id = 4, Naam = "Leeuw", Type = "Jungle", Prijs = 250, Afbeelding = "Content/images/leeuw.png" });
            context.Beestjes.Add(new Beestje() { Id = 5, Naam = "Hond", Type = "Boerderij", Prijs = 75, Afbeelding = "Content/images/doggo.png" });
            context.Beestjes.Add(new Beestje() { Id = 6, Naam = "Ezel", Type = "Boerderij", Prijs = 150, Afbeelding = "Content/images/donkey.png" });
            context.Beestjes.Add(new Beestje() { Id = 7, Naam = "Koe", Type = "Boerderij", Prijs = 100, Afbeelding = "Content/images/koe.png" });
            context.Beestjes.Add(new Beestje() { Id = 8, Naam = "Eend", Type = "Boerderij", Prijs = 50, Afbeelding = "Content/images/duck.png" });
            context.Beestjes.Add(new Beestje() { Id = 9, Naam = "Kuiken", Type = "Jungle", Prijs = 35, Afbeelding = "Content/images/kuiken.png" });
            context.Beestjes.Add(new Beestje() { Id = 10, Naam = "Pinguin", Type = "Sneeuw", Prijs = 175, Afbeelding = "Content/images/pingwing.png" });
            context.Beestjes.Add(new Beestje() { Id = 11, Naam = "IJsbeer", Type = "Sneeuw", Prijs = 300, Afbeelding = "Content/images/ijsbeer.png" });
            context.Beestjes.Add(new Beestje() { Id = 12, Naam = "Zeehond", Type = "Sneeuw", Prijs = 200, Afbeelding = "Content/images/zeehond.png" });
            context.Beestjes.Add(new Beestje() { Id = 13, Naam = "Kameel", Type = "Woestijn", Prijs = 175, Afbeelding = "Content/images/kameel.png" });
            context.Beestjes.Add(new Beestje() { Id = 14, Naam = "Slang", Type = "Sneeuw", Prijs = 125, Afbeelding = "Content/images/slang.png" });

            var accessoire1 = new Accessoire() { Naam = "Banaan", Prijs = 0.50 };
            accessoire1.Beestjes.Add(context.Beestjes.Find(1));
            context.Accessoires.Add(accessoire1);

            var accessoire2 = new Accessoire() { Naam = "Zadel", Prijs = 4.50 };
            accessoire2.Beestjes.Add(context.Beestjes.Find(3));
            context.Accessoires.Add(accessoire2);

            var accessoire3 = new Accessoire() { Naam = "Krukje", Prijs = 5 };
            accessoire3.Beestjes.Add(context.Beestjes.Find(4));
            context.Accessoires.Add(accessoire3);

            var accessoire4 = new Accessoire() { Naam = "Zweep", Prijs = 2.50 };
            accessoire4.Beestjes.Add(context.Beestjes.Find(4));
            context.Accessoires.Add(accessoire4);

            var accessoire5 = new Accessoire() { Naam = "Bal", Prijs = 2.50 };
            accessoire5.Beestjes.Add(context.Beestjes.Find(5));
            accessoire5.Beestjes.Add(context.Beestjes.Find(12));
            context.Accessoires.Add(accessoire5);

            var accessoire6 = new Accessoire() { Naam = "Dansschoenen", Prijs = 3.00 };
            accessoire6.Beestjes.Add(context.Beestjes.Find(10));
            context.Accessoires.Add(accessoire6);

            context.SaveChanges();
        }
    }

這很可能是由於對於每個BeestjeAccessoires屬性在您嘗試在視圖中訪問它之前不會加載,而此時MyContext已經被釋放。

解決方案是使用.Include()告訴 EF 立即加載它們,這被稱為“預先加載”:

using (var context = new MyContext())
{
    beestjes = context.Beestjes
        .Include("Accessoires")
        .ToList();

    return View(beestjes);
}

有關參考,請參閱https://learn.microsoft.com/en-us/ef/ef6/querying/related-data

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM