Avoiding ObjectDisposedException with LINQ (LINQ2SQL)

I encounter a "Lazy IO Problem" in Linq and I have not found a solution that I like

Problem setting

Say we have SQL tables that look like

create table Person (
    id int primary key not null,
    name text not null,
)

create table Dog (
    name text primary key not null,
    ownerid text primary key not null references Person(name)
)

And in C # we want to use LINQ and Entity Framework to solve this problem. Entity Framework classes are defined as partial, so we can extend them to add a method .Get(string), and this makes very clean code.

public partial class Dog 
{
    public static Dog Get(string dogname) 
    {
        using (var db = new MyDataContext())
        {
            // LINQ is lazy and doesn't load the referenced Person
            return db.Dogs.Single(d => d.name == dogname);
        }
    }
}

In case of a problem

Now we are trying to use the object Dogfor something

public string DogJson(string dogname) 
{
    var dog = Dog.Get(dogname);
    return JsonConvert.SerializeObject(dog);
}

Dog dog.Owner - , JsonConvert, , json. DataContext LINQ , ObjectDisposedException, , , dog.Person , DataContext.

Owner, Dog json. ?

, . Dog, Dog .

public static Dog Get(string dogname)
{
    using (var db = new MyDataContext())
    {
        var tmpdog = db.Dogs.Where(d => d.name == dogname)
            .Select(d => new { name = d.name, ownerid = d.ownerid}).Single();
        return new Dog() { name = tmpdog.name, ownerid = tmpdog.ownerid};
    }
}

, . , - . LINQ , .

, .

+4
3

, DbContext, , DogJson . DbContext Get.

, Get :

public static Dog Get(string dogname, MyDataContext db)
{
    var result = db.Dogs.SingleOrDefault(d => d.name == dogname);
    return result;
}

DTO , :

public string DogJson(string dogname) 
{
    using (var db = new MyDataContext())
    {
        var dog = Dog.Get(dogname, db);
        var dogDTO = new Dog { name = dog.name, ownerid = dog.ownerid };
        return JsonConvert.SerializeObject(dogDTO);
    }
}
+1

, , , . - . json serializer .

public static Dog Get(string dogname) 
{
    using (var db = new MyDataContext())
    {
        db.Configuration.ProxyCreationEnabled = false;
        db.Configuration.LazyLoadingEnabled = false;
        return db.Dogs.Single(d => d.name == dogname);
    }
}
+2

. Newtonsoft, , , , JsonConvert.SerializeObject.

, [JsonIgnore] , . Owner, :

[JsonIgnore]
public Person Owner{ get; set; }

, .

+1

All Articles