Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Code Contracts and Fluent API with EF Code First Sample

Consider the following code snippet:

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);
    }
}

On line 8 (.HasOptional, .WithRequired) code contracts analysis tool produces the following two warnings "CodeContracts: Possibly calling a method on a null reference"

Any ideas how to deal with it?

like image 951
Konstantin Tarkus Avatar asked May 03 '26 11:05

Konstantin Tarkus


1 Answers

One option is to mark the whole method with [ContractVerification(false)] attribute:

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);
    }
}

Another one is to add dozens of Contract.Assume() checks:

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);
    }
}

Which other options do we have? Which one do you prefer?

like image 168
Konstantin Tarkus Avatar answered May 05 '26 09:05

Konstantin Tarkus



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!