Кто закрывает мои связи? (ADO.NET, EF) [дубликат]

Для первого вопроса:

  1. Создайте уникальное ограничение для обоих столбцов
  2. Убедитесь, что вы всегда сортируете столбцы. Поэтому, если ваша таблица имеет colummns a и b , чем убедитесь, что a меньше или равно b

Для второго вопроса:

  SELECT * FROM many_to_many_table ГДЕ a = A или b = A  
47
задан Sindre 27 March 2013 в 20:38
поделиться

4 ответа

На самом деле это два вопроса в одном:

  1. Когда следует использовать Dispose() контекста?
  2. Какова должна быть продолжительность моего контекста?

Ответы:

  1. Никогда 1. using является неявным Dispose() в блоке try-finally. Отдельный оператор Dispose может быть пропущен, когда исключение происходит раньше. Кроме того, в большинстве распространенных случаев не вызывать Dispose вообще (неявно или явно) не является вредным .
  2. См., Например, Entity Framework 4 - продолжительность жизни / область контекста в приложении winform . Короче говоря, продолжительность жизни должна быть «короткой», статический контекст плох.

1 Как некоторые люди прокомментировали, исключение из этого правила заключается в том, что контекст является частью компонента, который сам реализует IDisposable и делится своим жизненным циклом. В этом случае вы вызываете context.Dispose() в методе Dispose компонента.

84
ответ дан Community 15 August 2018 в 17:38
поделиться
  • 1
    Спасибо, Герт Арнольд. Я прочитаю образец «Единицы работы»! – Sindre 27 March 2013 в 23:53
  • 2
    Hmmm, делает & quot; Никогда & quot; по-прежнему применяются, если вы не используете "использование" для переноса вашего контекста (ссылаясь на случай 1)? – gitsitgo 4 September 2013 в 20:28
  • 3
    Я точно не получил комментарий try-finally, вы имеете в виду try-catch? потому что я добавил в свою часть catch в случае возникновения исключения. можете ли вы подтвердить, нормально ли удалять, когда исключение поймано? Благодарю. – batmaci 12 June 2014 в 18:02
  • 4
    @batmaci Нет, я имею в виду использование конструкции using, вместо try-finally, потому что это более или менее то же самое. По using вам никогда не нужно называть Dispose. – Gert Arnold 12 June 2014 в 18:54
  • 5
    Ответ на Никогда вызывает dispose в вашем контексте неправильно - это зависит от типа приложения - то есть. В MVC вы переопределяете метод dispose контроллера и вызываете dispose в контекст - вам только не нужно вручную его вызывать при использовании using – Luke T O'Brien 9 January 2017 в 12:10

Вы можете определить свой контекст базы данных как поле класса и реализовать IDisposable. Что-то вроде ниже:

public class MyCoolDBManager : IDisposable
{
    // Define the context here.
    private DomainDbContext _db;

    // Constructor.
    public MyCoolDBManager()
    {
        // Create a new instance of the context.
        _db = new DomainDbContext();
    }

    // Your method.
    public string GetName(string userId)
    {           
        string userName = context.UserNameItems.FirstOrDefault(x => x.UserId == userId);

        return userName;
    } 

    // Implement dispose method.
    // NOTE: It is better to follow the Dispose pattern.
    public void Dispose()
    {
         _db.dispose();
         _db = null;
    }
}
1
ответ дан A-Sharabiani 15 August 2018 в 17:38
поделиться

Я следовал за хорошими учебниками по использованию EF, и они не нарушают контекст.

Мне было немного интересно, и я заметил, что даже уважаемый Microsoft VIP не распоряжается контекстом , Я обнаружил, что вам не нужно размещать dbContext в нормальной ситуации.

Если вы хотите получить дополнительную информацию, вы можете прочитать этот пост в блоге , в котором кратко объясняется, почему.

27
ответ дан Daniel 15 August 2018 в 17:38
поделиться

Еще лучше:

public static string GetName(string userId)
{
    using (var context = new DomainDbContext()) {
        return context.UserNameItems.FirstOrDefault(x => x.UserId == userId);
    }
}

Не нужно возвращать результат из области using; просто верните его немедленно, и вы все равно получите желаемое поведение.

11
ответ дан Todd Menier 15 August 2018 в 17:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: