Кодовые контракты и свободный API с EF Code First Sample - PullRequest
3 голосов
/ 19 апреля 2011

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

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: возможно, вызов метода для пустой ссылки»1004 *

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

Ответы [ 2 ]

2 голосов
/ 19 апреля 2011

Один вариант - пометить весь метод атрибутом [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);
    }
}

Еще один - добавить десятки контрактов.Проверка 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);
    }
}

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

1 голос
/ 19 апреля 2011

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

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

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

...