Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Possibility to introduce templating for on-model-creating method #20

Closed
ErikEJ opened this issue May 19, 2018 · 15 comments
Closed

Possibility to introduce templating for on-model-creating method #20

ErikEJ opened this issue May 19, 2018 · 15 comments
Labels

Comments

@ErikEJ
Copy link
Owner

ErikEJ commented May 19, 2018

From @mbharodia on April 12, 2018 13:46

Here is handle bar template for DbContext

{{> dbimports}}
namespace {{namespace}}
{
public partial class {{class}} : DbContext
{
{{> dbsets}}
{{#if entity-type-errors}}
{{#each entity-type-errors}}
{{spaces 8}}{{{entity-type-error}}}
{{/each}}
{{/if}}
{{{on-configuring}}}
{{{on-model-creating}}}
}
}

on-model-creating injects

protected override void OnModelCreating(ModelBuilder modelBuilder)

I like to do the following

protected override void OnModelCreating(ModelBuilder modelBuilder)
{

  `//code generated by the tool goes here//`

  `//my own code that I could add using template//`
  `OnModelCreatingPartial(modelBuilder);`

}

The way template has been designed right now, I am not able to inject the following (or I may not know)

OnModelCreatingPartial(modelBuilder)

Here is my updated template to introduce partial method

{{> dbimports}}
namespace {{namespace}}
{
public partial class {{class}} : DbContext
{
{{> dbsets}}
{{#if entity-type-errors}}
{{#each entity-type-errors}}
{{spaces 8}}{{{entity-type-error}}}
{{/each}}
{{/if}}
{{{on-configuring}}}
{{{on-model-creating}}}
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}
}

As DbContext is partial class already, I can have another partial class and add required code as per my requirements. I think this provides me an easier way to extend the functionality using PARTIAL setup.

I think the above is already available in EF6 POCO Generated and it has been useful to me in many instances. I am just wondering whether there is any possibility of doing the same thing.

I highly appreciate your recommendation or feedback or any help in this regard

Copied from original issue: ErikEJ/SqlCeToolbox#695

@ErikEJ
Copy link
Owner Author

ErikEJ commented May 19, 2018

PRs are very welcome - does this work for you as desired?

@ErikEJ
Copy link
Owner Author

ErikEJ commented May 19, 2018

Looks like it is related to ErikEJ/SqlCeToolbox#683

@ErikEJ
Copy link
Owner Author

ErikEJ commented May 19, 2018

From @mbharodia on April 12, 2018 15:26

Hi Eric:

The tool you have developed is really useful.

Earlier I used POCO generator for EF 6 and I had an opportunity to extend the context class using partial methods. I have come across many occasions, when I needed to extend the partial context class generated by the tool due to the legacy databases were not designed to support domain driven development; for example, missing Primary Key and Foreign Key did not enable the tool to generate required relationships between parent and child objects.

This can be easily fixed if there is an opportunity to extend this context class by manually writing some code using fluent APIs.

Thanks, and have a good day!

Regards,
Mayur
From: Erik Ejlskov Jensen notifications@github.com
Sent: April 12, 2018 7:52 AM
To: ErikEJ/SqlCeToolbox SqlCeToolbox@noreply.github.com
Cc: Mayur Bharodia mayur@interactiveinterfaces.ca; Author author@noreply.github.com
Subject: Re: [ErikEJ/SqlCeToolbox] Possibility to introduce templating for on-model-creating method (#695)

PRs are very welcome - does this work for you as desired?


You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHubErikEJ/SqlCeToolbox#695 (comment), or mute the threadhttps://github.com/notifications/unsubscribe-auth/AJ3YweNC_rnEeXBapg_9g-LYJC7fGhi9ks5tn1vqgaJpZM4TR0n7.

@ErikEJ
Copy link
Owner Author

ErikEJ commented May 19, 2018

I will try to simply always add the two extra lines:

   OnModelCreatingPartial(modelBuilder);

and

  partial void OnModelCreatingPartial(ModelBuilder modelBuilder);

@ErikEJ
Copy link
Owner Author

ErikEJ commented May 19, 2018

From @mbharodia on April 15, 2018 20:15

Okay. Thanks a lot for your help!

From: Erik Ejlskov Jensen [mailto:notifications@github.com]
Sent: April 15, 2018 9:37 AM
To: ErikEJ/SqlCeToolbox SqlCeToolbox@noreply.github.com
Cc: Mayur Bharodia mayur@interactiveinterfaces.ca; Author author@noreply.github.com
Subject: Re: [ErikEJ/SqlCeToolbox] Possibility to introduce templating for on-model-creating method (#695)

I will try to simply always add the two extra lines:

OnModelCreatingPartial(modelBuilder);

and

partial void OnModelCreatingPartial(ModelBuilder modelBuilder);


You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHubErikEJ/SqlCeToolbox#695 (comment), or mute the threadhttps://github.com/notifications/unsubscribe-auth/AJ3YwTrD2rUrGUZmaTGn0ZEO9SdLcV2Uks5to2kpgaJpZM4TR0n7.

@ErikEJ
Copy link
Owner Author

ErikEJ commented May 19, 2018

@mbharodia Fixed in latest daily build (no Handlebars required)

@ErikEJ
Copy link
Owner Author

ErikEJ commented May 19, 2018

From @mbharodia on April 28, 2018 13:12

Thank you so much Erik!

From: Erik Ejlskov Jensen notifications@github.com
Sent: April 28, 2018 3:44 AM
To: ErikEJ/SqlCeToolbox SqlCeToolbox@noreply.github.com
Cc: Mayur Bharodia mayur@interactiveinterfaces.ca; Mention mention@noreply.github.com
Subject: Re: [ErikEJ/SqlCeToolbox] Possibility to introduce templating for on-model-creating method (#695)

@mbharodiahttps://github.com/mbharodia Fixed in latest daily build (no Handlebars required)


You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHubErikEJ/SqlCeToolbox#695 (comment), or mute the threadhttps://github.com/notifications/unsubscribe-auth/AJ3YwdQ6Rxo46wGlKU-n8rMOXE1cqEOzks5ttDnMgaJpZM4TR0n7.

@ErikEJ
Copy link
Owner Author

ErikEJ commented May 19, 2018

Please let me know if it solves your issue!

@ErikEJ
Copy link
Owner Author

ErikEJ commented May 19, 2018

From @mbharodia on April 30, 2018 17:54

Hi Erik:

It looks like that it is not working as per the expectation. When I got the latest daily build, it generated the following code.

namespace CCData.DataContext
{
    public partial class CustomCareDataContext : DbContext
    {
        public virtual DbSet<Account> Accounts { get; set; }       

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
            }
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Account>(entity =>
            {
                entity.ToTable("accounts");

                entity.Property(e => e.AccountId).HasColumnName("account_id");

                entity.Property(e => e.AccountIsVerified)
                    .IsRequired()
                    .HasColumnName("account_is_verified")
                    .HasMaxLength(3)
                    .IsUnicode(false)
                    .HasDefaultValueSql("('NRQ')");

                entity.Property(e => e.AccountOpeningBalance)
                    .HasColumnName("account_opening_balance")
                    .HasColumnType("numeric(8, 2)");

                entity.Property(e => e.AccountOpeningDate)
                    .HasColumnName("account_opening_date")
                    .HasColumnType("datetime");

                entity.Property(e => e.AccountStatus)
                    .IsRequired()
                    .HasColumnName("account_status")
                    .HasMaxLength(3)
                    .IsUnicode(false)
                    .HasDefaultValueSql("('ACT')");

                entity.Property(e => e.CompanyId).HasColumnName("company_id");

                entity.HasOne(d => d.Company)
                    .WithMany(p => p.Accounts)
                    .HasForeignKey(d => d.CompanyId)
                    .OnDelete(DeleteBehavior.ClientSetNull)
                    .HasConstraintName("FK_accounts_companies");
            });
            
        }

    }
            OnModelCreatingPartial(modelBuilder);
}

I think that the correct code should be like the following. Please pay attention to "OnModelCreatingPartial" at two different places below.

namespace CCData.DataContext
{
    public partial class CustomCareDataContext : DbContext
    {
        public virtual DbSet<Account> Accounts { get; set; }
       

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
            }
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Account>(entity =>
            {
                entity.ToTable("accounts");

                entity.Property(e => e.AccountId).HasColumnName("account_id");

                entity.Property(e => e.AccountIsVerified)
                    .IsRequired()
                    .HasColumnName("account_is_verified")
                    .HasMaxLength(3)
                    .IsUnicode(false)
                    .HasDefaultValueSql("('NRQ')");

                entity.Property(e => e.AccountOpeningBalance)
                    .HasColumnName("account_opening_balance")
                    .HasColumnType("numeric(8, 2)");

                entity.Property(e => e.AccountOpeningDate)
                    .HasColumnName("account_opening_date")
                    .HasColumnType("datetime");

                entity.Property(e => e.AccountStatus)
                    .IsRequired()
                    .HasColumnName("account_status")
                    .HasMaxLength(3)
                    .IsUnicode(false)
                    .HasDefaultValueSql("('ACT')");

                entity.Property(e => e.CompanyId).HasColumnName("company_id");

                entity.HasOne(d => d.Company)
                    .WithMany(p => p.Accounts)
                    .HasForeignKey(d => d.CompanyId)
                    .OnDelete(DeleteBehavior.ClientSetNull)
                    .HasConstraintName("FK_accounts_companies");
            });

            OnModelCreatingPartial(modelBuilder);
        }

        partial void OnModelCreatingPartial(ModelBuilder modelBuilder);

    }
            
}

Additionally, handlebar setup stopped working. I know that you have mentioned that this build is for "no handlebar" support. I guess it is still good to have handlebar to do some customization if needed.

The above explanation may not make sense if I have missed anything that you wanted me to look into before running the templates for your latest daily build. Please let me know your feedback.

@ErikEJ
Copy link
Owner Author

ErikEJ commented May 19, 2018

Hmmm... Tried a diferent approach in the latest build

@ErikEJ
Copy link
Owner Author

ErikEJ commented May 19, 2018

@mbharodia I have attempted a fix in the latest daily build, would be grateful if you could try it out

@ErikEJ
Copy link
Owner Author

ErikEJ commented May 24, 2018

@mbharodia ping?

@ErikEJ ErikEJ added the reveng label May 24, 2018
@mbharodia
Copy link

Hi Erick. That worked well! Thank you.

I am not sure whether it is a lot to ask further, however, is it possible to do the same with POCO classes?

 public partial class Audit
    {
        public Audit()
        {
            **OnModelCreatingPartial();**
        }
        public int AuditId { get; set; }
        public string AuditEntityType { get; set; }
        public string AuditEntityJson { get; set; }
        public DateTime AuditCreateDate { get; set; }
        public string AuditCreatedBy { get; set; }

        **partial void OnModelCreatingPartial();**
    }

Additionally, I don't see handle bar support. Earlier it was easier for me to add extra Using statements to classes generated.

I create POCO classes and DbContext in a separate project and Using Statement is needed in DbContext so that it can reference the project with POCO classes. I am wondering whether handle bar support is going be supported or not.

However, I really appreciate your help with the above.

@ErikEJ
Copy link
Owner Author

ErikEJ commented May 25, 2018

@mbharodia The poco classes are already partial, and OnMoldeCreating does not make any sense here.

The Handlebars feature is temporarily disabled, see #12

@ErikEJ ErikEJ closed this as completed May 25, 2018
@ErikEJ
Copy link
Owner Author

ErikEJ commented May 26, 2018

@mbharodia Handlebars are back in latest daily build

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants