Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Entity Framework code first with T4 template

I am going to create code-first view by using a T4 template like the below mentioned article says:

Article here

But it's causing an

run time exception

like below. Why's that?

My connection string is configured properly in App.config.

My application is N-Tier based.So That DbContext driven class is in Data Layer.

This is my connection String:

<add name="PawLoyalty" connectionString="Server=.;database=PawLoyalty;Trusted_connection=true;pooling=true;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />

I am using EF 4.1 with vs 2010.

Running transformation: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
---> System.ArgumentException: The argument 'nameOrConnectionString' cannot be null, empty or contain only white space.

at System.Data.Entity.ModelConfiguration.Utilities.RuntimeFailureMethods.ReportFailure(ContractFailureKind contractFailureKind, String userMessage, String conditionText, Exception innerException)
at System.Data.Entity.DbContext..ctor(String nameOrConnectionString)
at PawLoyalty.Data.DataCatalog..ctor(Boolean allowLazyLoading) in D:\My Blog\Test Projects\PawLoyalty\PawLoyalty\PawLoyalty.Data\DataCatalog.cs:line 31
at PawLoyalty.Data.DataCatalog..ctor() in D:\My Blog\Test Projects\PawLoyalty\PawLoyalty\PawLoyalty.Data\DataCatalog.cs:line 26
--- End of inner exception stack trace ---
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
at System.Activator.CreateInstance(Type type, Boolean nonPublic)
at System.Activator.CreateInstance(Type type)
at Microsoft.VisualStudio.TextTemplatingD6E95B37BD0790EBBCC7DB570AD3E2AC.GeneratedTextTransformation.GetEdmx(Type contextType)
at Microsoft.VisualStudio.TextTemplatingD6E95B37BD0790EBBCC7DB570AD3E2AC.GeneratedTextTransformation.GenerateViews(String contextTypeName)
at Microsoft.VisualStudio.TextTemplatingD6E95B37BD0790EBBCC7DB570AD3E2AC.GeneratedTextTransformation.TransformText()
at Microsoft.VisualStudio.TextTemplating.TransformationRunner.RunTransformation(TemplateProcessingSession session, String source, ITextTemplatingEngineHost host, String& result)

Updated

My DbContext Derived class looks like below.

 [Export(typeof(ISecurityDataCatalog))]
    [Export(typeof(IMappingDataCatalog))]
    [Export(typeof(IPawLoyaltyDataCatalog))]
    [PartCreationPolicy(CreationPolicy.NonShared)]
    public class DataCatalog : DbContext, IPawLoyaltyDataCatalog, ISecurityDataCatalog, IMappingDataCatalog
    {

        public static string ConnectionString { get; set; }
        public static string AccountToken { get; set; }

        public DataCatalog()
            : this(false)
        {
        }

        public DataCatalog(bool allowLazyLoading = false)
            : base(ConnectionString)
        {
            Configuration.LazyLoadingEnabled = allowLazyLoading;
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.ComplexType<DiscountValue>().Property(d => d.Fixed).HasPrecision(18, 2);
            modelBuilder.ComplexType<DiscountValue>().Property(d => d.Percentage).HasPrecision(18, 4);
            modelBuilder.Entity<InvoiceFee>().Property(d => d.Fixed).HasPrecision(18, 2);
            modelBuilder.Entity<InvoiceFee>().Property(d => d.Percentage).HasPrecision(18, 4);
            modelBuilder.Entity<InvoiceFee>().Property(d => d.Total).HasPrecision(18, 4);
            modelBuilder.Entity<Invoice>().Property(d => d.Discount).HasPrecision(18, 2);
            modelBuilder.Entity<Invoice>().HasRequired(i => i.Appointment).WithOptional(a => a.Invoice).WillCascadeOnDelete(false);
            modelBuilder.Entity<InvoiceItem>().Property(d => d.Price).HasPrecision(18, 2);
            modelBuilder.Entity<InvoiceItem>().Property(d => d.LatestTotal).HasPrecision(18, 2);
            modelBuilder.Entity<InvoiceItem>().HasRequired(i => i.Allocation).WithOptional(a => a.InvoiceItem).WillCascadeOnDelete(false);
            modelBuilder.Entity<InvoicePayment>().Property(d => d.Amount).HasPrecision(18, 4);
            modelBuilder.Entity<ServicePrice>().Property(d => d.Price).HasPrecision(18, 2);
            modelBuilder.Entity<ServiceBreedPrice>().Property(d => d.Price).HasPrecision(18, 2);
            modelBuilder.Entity<ProviderPolicy>().Property(d => d.SalesTax).HasPrecision(18, 4);
            modelBuilder.Entity<ProviderCredit>().Property(d => d.Balance).HasPrecision(18, 2);
            modelBuilder.Entity<CombinedServiceDiscountDefinition>().HasRequired(c => c.PrimaryService).WithMany().WillCascadeOnDelete(false);
            modelBuilder.Entity<CombinedServiceDiscountDefinition>().HasRequired(c => c.SecondaryService).WithMany().WillCascadeOnDelete(false);

            modelBuilder.Entity<MedicalRecord>().HasRequired(m => m.Pet).WithOptional(p => p.Medical).WillCascadeOnDelete(false);
            modelBuilder.Entity<BehavioralRecord>().HasRequired(b => b.Pet).WithOptional(p => p.Behavioral).WillCascadeOnDelete(false);
            modelBuilder.Entity<DietRecord>().HasRequired(d => d.Pet).WithOptional(p => p.Diet).WillCascadeOnDelete(false);

            modelBuilder.Entity<Provider>().HasOptional(p => p.Profile).WithRequired(p => p.Provider).WillCascadeOnDelete(true);

            modelBuilder.Entity<ProviderProfile>().HasOptional(p => p.Policy).WithRequired(p => p.Profile).WillCascadeOnDelete(true);
            modelBuilder.Entity<ProviderProfile>().HasOptional(p => p.CustomerRequirements).WithRequired(p => p.Profile).WillCascadeOnDelete(true);
            modelBuilder.Entity<ProviderProfile>().HasOptional(p => p.PaymentProfile).WithRequired(p => p.Profile).WillCascadeOnDelete(true);

            modelBuilder.Entity<Resource>().HasMany(r => r.Availability).WithRequired(a => a.Resource).WillCascadeOnDelete(true);

            Database.SetInitializer<DataCatalog>(null);
            base.OnModelCreating(modelBuilder);
        }

        public const string ServiceKey = "PawLoyalty";

        public DbSet<StreetAddress> StreetAddresses { get; set; }
        public DbSet<Appointment> Appointments { get; set; }
        public DbSet<Invoice> Invoices { get; set; }
        public DbSet<InsuranceCarrier> InsuranceCarriers { get; set; }
        public DbSet<PromotionCode> PromotionCodes { get; set; }

        // Provider Classes
        public DbSet<Provider> Providers { get; set; }
        public DbSet<ProviderProfile> ProviderProfiles { get; set; }
        //public DbSet<ProviderResourceItem> ProviderResourceItems { get; set; }
        public DbSet<Allocation> ResourceAllocations { get; set; }
        public DbSet<ResourceAvailability> ResourceAvailabilities { get; set; }
        public DbSet<Resource> Resources { get; set; }

        /// <summary>
        /// Wraps the object context detach method
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="t"></param>
        public void Detach<T>(T t) where T : class
        {
            // TODO: Is this needed? Hidden behind an interface in CTP5 implying infrequent usage.
            ((IObjectContextAdapter)this).ObjectContext.Detach(t);
        }

        // Owner Classes
        public DbSet<MedicalRecordOrder> Orders { get; set; }
        public DbSet<Owner> Owners { get; set; }
        public DbSet<Pet> Pets { get; set; }
        public DbSet<Breed> Breeds { get; set; }
        public DbSet<PetProvider> PetProviders { get; set; }

        // Security Catalog Items
        public DbSet<User> Users { get; set; }

        // Bing Maps Catalog items
        public DbSet<KnownLocation> KnownLocations { get; set; }
        public DbSet<KnownPostalCode> KnownPostalCodes { get; set; }

        public DbSet<QueuedEmail> QueuedEmails { get; set; }
        public DbSet<InvoicePayment> InvoicePayments { get; set; }
        public DbSet<Employee> Employees { get; set; }
        public DbSet<Schedule> Schedules { get; set; }
        public DbSet<Subscription> Subscriptions { get; set; }
        public DbSet<EmailSubscription> EmailSubscriptions { get; set; }

        public DbSet<ResourceAvailabilityUpdate> ResourceAvailabilityUpdates { get; set; }
        public DbSet<EmployeeAvailabilityUpdate> EmployeeAvailabilityUpdates { get; set; }
        public DbSet<InvoiceConfiguration> InvoiceConfigurations { get; set; }

        public DbSet<Vaccine> Vaccines { get; set; }
        public DbSet<TourEmail> TourEmails { get; set; }
        public DbSet<ReservationRequest> ReservationRequest { get; set; }
        //public DbSet<ReservationRequestPets> ReservationRequestPets { get; set; }
        public DbSet<Vaccination> Vaccinations { get; set; }
        public DbSet<SpecialInstruction> SpecialInstructions { get; set; }

        public DbSet<Product> Products { get; set; }
        public DbSet<ProductCategory> ProductCategories { get; set; }
        public DbSet<VendorStock> VendorStocks { get; set; }
        public DbSet<ShoppingCart> ShoppingCarts { get; set; }
        public DbSet<SaleDetail> SaleDetails { get; set; }
        public DbSet<Sale> Sales { get; set; }
        public DbSet<SalePayment> SalePayments { get; set; }

        public DbSet<PetService> PetServices { get; set; }
        public DbSet<PetServicePrice> PetServicePrices { get; set; }

        public DbSet<MiscProperty> MiscProperties { get; set; }
        public DbSet<ProviderMiscProperty> ProviderMiscProperties { get; set; }

        public DbSet<ProviderAuthorizedCreditCard> ProviderAuthorizedCreditCards { get; set; }
        public DbSet<AuthorizedCreditCard> AuthorizedCreditCards { get; set; }
        public DbSet<ProviderPackage> ProviderPackages { get; set; }

        public DbSet<ProviderEmailPreference> ProviderEmailPreferences { get; set; }
        public DbSet<EmailType> EmailTypes { get; set; }

        public DbSet<RetailSaleReturn> RetailSaleReturns { get; set; }
        public DbSet<ServiceRefund> ServiceRefunds { get; set; }

    }
like image 809
Sampath Avatar asked Dec 08 '12 10:12

Sampath


1 Answers

problem is DbContext Derived class's (DataCatalog) parameter less constructor connection string issue.

With support of @Pawel I have sorted out my problem. You just need to give connection string for parameter less constructor as below.

 public class DataCatalog : DbContext
    {
        public static string ConnectionString { get; set; }

        public DataCatalog() : base(ConnectionString ?? "PawLoyalty")
        {

        }  
    }

Note 1 : If you're in separate layer (class library project) then you have to give your connection string on App.Config file.

Note 2 : After doing all the changes you have to compile your project before run T4 template again

Hope this will help some one in future.

like image 164
Sampath Avatar answered Oct 02 '22 06:10

Sampath