Использование EF POCO с SQL Server Compact 4 - PullRequest
0 голосов
/ 09 июля 2011

Я разрабатываю приложение с использованием SQL CE и EF Poco 4.

Следующий код

Контекст

public class Context : DbContext
{
    public DbSet<BoletimSemanal> BoletinsSemanais { get; set; }

    public Context()
        : base("name=DefaultConnection")
    {
    }
}

Модель

public class BoletimSemanal
{
    [Key]
    public int ID { get; set; }
    public string Name { get; set; }
    public DateTime DateCreated { get; set; }
    public DateTime DateModified { get; set; }
    public int Week { get; set; }
    public int Year { get; set; }
}

Контроллер

public ActionResult Index()
{
    IQueryable<BoletimSemanal> boletins;
    using (var db = new Context())
    {
        var calInfo = DateTimeFormatInfo.CurrentInfo;
        var week = calInfo.Calendar.GetWeekOfYear(DateTime.Now, calInfo.CalendarWeekRule, calInfo.FirstDayOfWeek);


        boletins = (from boletim in db.BoletinsSemanais
                    where boletim.Week == week
                            && boletim.Year == DateTime.Now.Year
                    select boletim);
    }

    return View(boletins.DefaultIfEmpty());
}

Web.config

<connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=|DataDirectory|Data.sdf;" providerName="System.Data.SqlServerCe.4.0" />
</connectionStrings>

Просмотр

@model IEnumerable<SextaIgreja.Web.Models.BoletimSemanal>
@{
    ViewBag.Title = "Downloads";
}
<div id="boletim-semanal" class="column last">
    <p class="title">Boletim Semanal
    @if (Request.IsAuthenticated)
    { 
        @Html.ActionLink("+", "Create", "Downloads", new { @class="add" })
    }
    </p>
    <div class="content border">
        <p>Content</p>
        <ul>
        @foreach (var item in Model)
        {
            <li>@item.Name</li>
        }
        </ul>
    </div>
</div>

в foreach возникает следующая ошибка:

Экземпляр ObjectContext был удален и больше не может использоваться для операций, которыетребуют подключения.

Описание: необработанное исключение произошло во время выполнения текущего веб-запроса.Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.ObjectDisposedException: экземпляр ObjectContext был удален и больше не может использоваться для операций, требующих подключения.

Ошибка источника:

Ответы [ 2 ]

1 голос
/ 09 июля 2011

Попробуйте передать IList вместо IQueryable.
Вы можете сделать это, добавив .ToList () в конец запроса linq:

boletins = (from boletim in db.BoletinsSemanais
            where boletim.Week == week
            && boletim.Year == DateTime.Now.Year
            select boletim).ToList();
1 голос
/ 09 июля 2011

Из вашего кода я вижу, что вы используете IQueryable. Это означает, что когда представление повторяет этот IQueryable, ObjectContext уже удаляется, поэтому вы не можете получить доступ к базе данных. Обратите внимание, что при использовании IQueryable данные из базы данных извлекаются, когда вы выполняете итерацию по ней (через foreach в вашем примере).

    IList<BoletimSemanal> boletins;

    boletins = (from boletim in db.BoletinsSemanais
                where boletim.Week == week
                        && boletim.Year == DateTime.Now.Year
                select boletim).ToList();

Попробуйте это, и оно должно работать.

...