Кодовые контракты и Fluent API с первым образцом EF Code

Рассмотрим следующий фрагмент кода:

public partial class DatabaseContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Contract.Assume(modelBuilder != null);

        modelBuilder.Entity<User>()
            .HasOptional(x => x.Profile).WithRequired(x => x.User);

        base.OnModelCreating(modelBuilder);
    }
}

В строке 8 (.HasOptional, .WithRequired) инструмент анализа кодовых контрактов выдает следующие два предупреждения: «CodeContracts: возможно, вызывается метод для нулевой ссылки».

Есть идеи, как с этим бороться?


person Konstantin Tarkus    schedule 19.04.2011    source источник


Ответы (2)


Один из вариантов — пометить весь метод атрибутом [ContractVerification(false)]:

public partial class DatabaseContext : DbContext
{
    [ContractVerification(false)]
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
            .HasOptional(x => x.Profile).WithRequired(x => x.User);

        base.OnModelCreating(modelBuilder);
    }
}

Еще один способ — добавить десятки проверок Contract.Assume():

public partial class DatabaseContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Contract.Assume(modelBuilder != null);

        var userEntity = modelBuilder.Entity<User>();
        Contracts.Assume(userEntity != null);
        var profileEntity = userEntity.HasOptional(x => x.Profile);
        Contracts.Assume(profileEntity != null);
        profileEntity.WithRequired(x => x.User);

        base.OnModelCreating(modelBuilder);
    }
}

Какие еще варианты у нас есть? Какой из них вы предпочитаете?

person Konstantin Tarkus    schedule 19.04.2011

Я не знаю EF, но я считаю, что вы не можете просто настроить функцию .Entity<User>()? Эта функция не указывает в контракте, что она возвращает ненулевое значение. Попробуйте следующее:

var userEntity = modelBuilder.Entity<User>();
Contract.Assert( userEntity != null );

Ps: я нашел эту ссылку, которая может вас заинтересовать, обсуждение контрактов кода и Entity Framework.

person Steven Jeuris    schedule 19.04.2011