Entity Framework code first with T4 template

.net, c#, entity-framework-4.1, t4, visual-studio-2010

Solution

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.

Problem

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

Original source