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; }
}
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With