0

Here is my model

enter image description here

I need to map this model to Entity Framework, but my results are building only one table named Fluxo, and there are lots of ugly FKs.

Besides, I don't know how can I map my PK, defined at Fluxo class

Here is my mappings

public class FluxoPrincipalMap : EntityTypeConfiguration<FluxoPrincipal>
    {
        public FluxoPrincipalMap()
        {

            HasRequired(f => f.CasoDeUso).WithOptional(c => c.FluxoPrincipal);    

        }
    }


public class FluxoAlternativoMap : EntityTypeConfiguration<FluxoAlternativo>
    {
        public FluxoAlternativoMap()
        {
        }
    }

class FluxoDeExcecaoMap : EntityTypeConfiguration<FluxoDeExcecao>
    {
        public FluxoDeExcecaoMap()
        {

        }
    }

UPDATE 1 - After Some Mapping Improvement

Ok, here is my new mappings

 public class FluxoPrincipalMap : EntityTypeConfiguration<FluxoPrincipal>
    {
        public FluxoPrincipalMap()
        {

            ToTable(nameof(FluxoPrincipal));

            HasKey(x => x.FluxoId);
            Property(x => x.FluxoId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

            HasRequired(f => f.CasoDeUso).WithOptional(c => c.FluxoPrincipal);

            Ignore(f => f.ValidationResult);
            Ignore(f => f.IsValid);
        }
    }

public class FluxoAlternativoMap : EntityTypeConfiguration<FluxoAlternativo>
    {
        public FluxoAlternativoMap()
        {
            ToTable(nameof(FluxoAlternativo));

            HasKey(x => x.FluxoId);
            Property(x => x.FluxoId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

            HasRequired(x => x.FluxoPrincipal)
                .WithMany(x => x.FluxosAlternativos)
                .HasForeignKey(x => x.FluxoPrincipalId);

            Ignore(x => x.ValidationResult);
            Ignore(x => x.IsValid);
        }
    }

class FluxoDeExcecaoMap : EntityTypeConfiguration<FluxoDeExcecao>
    {
        public FluxoDeExcecaoMap()
        {
            ToTable(nameof(FluxoDeExcecao));

            HasKey(x => x.FluxoId);
            Property(x => x.FluxoId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

            HasRequired(x => x.FluxoPrincipal)
                .WithMany(x => x.FluxosDeExcecao)
                .HasForeignKey(x => x.FluxoPrincipalId);

            Ignore(x => x.ValidationResult);
            Ignore(x => x.IsValid);
        }
    }

And here is my context config

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
            modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
            modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

            modelBuilder.Properties()
                // ReSharper disable once PossibleNullReferenceException
                .Where(p => p.Name == p.ReflectedType.Name + "Id")
                .Configure(p => p.IsKey());

            modelBuilder.Properties<string>()
                .Configure(p => p.HasColumnType("varchar"));

            modelBuilder.Properties<string>()
                .Configure(p => p.HasMaxLength(100));

            modelBuilder.Configurations.Add(new ProjetoMap());
            modelBuilder.Configurations.Add(new RequisitoMap());
            modelBuilder.Configurations.Add(new CasoDeUsoMap());
            modelBuilder.Configurations.Add(new FluxoPrincipalMap());
            modelBuilder.Configurations.Add(new FluxoAlternativoMap());
            modelBuilder.Configurations.Add(new FluxoDeExcecaoMap());

            base.OnModelCreating(modelBuilder);
        }
2
  • Does FluxoPrincipalMap inherit from Fluxo? Commented Dec 18, 2015 at 16:09
  • Yes... FluxoPrincipal, FluxoAlternativo and FluxoDeExcecao are 'Fluxo'. Commented Dec 18, 2015 at 16:10

1 Answer 1

1

There are 3 ways to work with inheritance in Entity Framework, you can see all of them here: http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph

THP

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

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());
    }
}

public class FluxoPrincipalMap : EntityTypeConfiguration<FluxoPrincipal>
{
    public FluxoPrincipalMap()
    {
        HasKey(x => x.FluxoID);
    }
}


public class FluxoAlternativoMap : EntityTypeConfiguration<FluxoAlternativo>
{
    public FluxoAlternativoMap()
    {
        HasKey(x => x.FluxoID);
    }
}

class FluxoDeExcecaoMap : EntityTypeConfiguration<FluxoDeExcecao>
{
    public FluxoDeExcecaoMap()
    {
        HasKey(x => x.FluxoID);
    }
}

TPT

public class Context : DbContext
{
    public DbSet<FluxoPrincipal> FluxoPrincipal { get; set; }
    public DbSet<FluxoAlternativo> FluxoAlternativo { get; set; }
    public DbSet<FluxoDeExcecao> FluxoDeExcecao { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());
    }
}

public class FluxoPrincipalMap : EntityTypeConfiguration<FluxoPrincipal>
{
    public FluxoPrincipalMap()
    {
        HasKey(x => x.FluxoID);
    }
}


public class FluxoAlternativoMap : EntityTypeConfiguration<FluxoAlternativo>
{
    public FluxoAlternativoMap()
    {
        HasKey(x => x.FluxoID);
    }
}

class FluxoDeExcecaoMap : EntityTypeConfiguration<FluxoDeExcecao>
{
    public FluxoDeExcecaoMap()
    {
        HasKey(x => x.FluxoID);
    }
}

TPC

public class Context : DbContext
{
    public DbSet<FluxoPrincipal> FluxoPrincipal { get; set; }
    public DbSet<FluxoAlternativo> FluxoAlternativo { get; set; }
    public DbSet<FluxoDeExcecao> FluxoDeExcecao { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());
    }
}

public class FluxoPrincipalMap : EntityTypeConfiguration<FluxoPrincipal>
{
    public FluxoPrincipalMap()
    {
        HasKey(x => x.FluxoID);
        Map(x => x.MapInheritedProperties());
    }
}


public class FluxoAlternativoMap : EntityTypeConfiguration<FluxoAlternativo>
{
    public FluxoAlternativoMap()
    {
        HasKey(x => x.FluxoID);
        Map(x => x.MapInheritedProperties());
    }
}

class FluxoDeExcecaoMap : EntityTypeConfiguration<FluxoDeExcecao>
{
    public FluxoDeExcecaoMap()
    {
        HasKey(x => x.FluxoID);
        Map(x => x.MapInheritedProperties());
    }
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.