6
votes

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

    }
2
How does the parameterless ctor on the DbContext derived class look like.Pawel
@Pawel I have added my DbContext derived class.Please check that.I am having N-Tier application and T4 generated views in Data Layer (where DbContext derived class also in that layer).I put my conn string on application config file.Sampath
The issue is that your ConnectionString variable is never initialized and therefore is null when the template invokes the parameterless constructor. Just to see if stuff works you may want to set ConnectionString in the parmeterless ctor to "Name=PawLoyalty" to bind the connection string from the config to the contextPawel
I am also curious why you need to use pregenerated views? You don't seem to have that many entity types and entity sets so I don't think you will notice any noticeable difference in your start up code.Pawel
can you tell me where should I put "Name=PawLoyalty" ?Sampath

2 Answers

7
votes

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.

1
votes

I'm writing this only based your error code. Your error code says:

The argument 'nameOrConnectionString' cannot be null, empty or contain only white space.

So your connection string has mistake. Check your connection string in your web config. Be sure you connection string doesn't have white space.