首先使用 T4 模板进行实体框架代码

2024-02-03

我将使用 T4 模板创建代码优先视图,如下面提到的文章所述:

文章在这里 http://blog.3d-logic.com/2012/06/13/entity-framework-codefirst-view-generation-templates-on-visual-studio-code-gallery/

但这正在引起

运行时异常

像下面这样。为什么?

我的连接字符串配置正确App.config.

我的申请是基于 N 层。以便DbContext驱动类位于数据层.

This is 我的连接字符串:

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

我将 EF 4.1 与 2010 一起使用。

运行转换:System.Reflection.TargetInitationException:已引发异常 通过调用的目标。
---> System.ArgumentException:参数“nameOrConnectionString”不能为 null、空或仅包含空格。

在System.Data.Entity.ModelConfiguration.Utilities.RuntimeFailureMethods.ReportFailure(ContractFailureKindcontractFailureKind,字符串userMessage,字符串conditionText, 异常(内部异常)
在 System.Data.Entity.DbContext..ctor(String nameOrConnectionString)
在 D:\My Blog\Test 中的 PawLoyalty.Data.DataCatalog..ctor(BooleanallowLazyLoading) 项目\PawLoyalty\PawLoyalty\PawLoyalty.Data\DataCatalog.cs:第 31 行
在 D:\My Blog\Test Projects\PawLoyalty\PawLoyalty\PawLoyalty.Data\DataCatalog.cs 中的 PawLoyalty.Data.DataCatalog..ctor() 处:第 26 行
--- 内部异常堆栈跟踪结束 ---
在 System.RuntimeTypeHandle.CreateInstance(RuntimeType 类型,布尔 publicOnly,布尔 noCheck,布尔& canBeCached, RuntimeMethodHandleInternal& 构造函数、布尔值& bNeedSecurityCheck)
在System.RuntimeType.CreateInstanceSlow(布尔publicOnly,布尔skipCheckThis,布尔fillCache,StackCrawlMark&stackMark)
在System.RuntimeType.CreateInstanceDefaultCtor(布尔publicOnly,布尔skipCheckThis,布尔fillCache,StackCrawlMark& 堆栈标记)
在 System.Activator.CreateInstance(类型类型,布尔非公共)
在 System.Activator.CreateInstance(类型类型)
在 Microsoft.VisualStudio.TextTemplatedD6E95B37BD0790EBBCC7DB570AD3E2AC.GeneeratedTextTransformation.GetEdmx(类型 上下文类型)
在 Microsoft.VisualStudio.TextTemplatedD6E95B37BD0790EBBCC7DB570AD3E2AC.GeneeratedTextTransformation.GenerateViews(字符串 contextTypeName)
在 Microsoft.VisualStudio.TextTemplatedD6E95B37BD0790EBBCC7DB570AD3E2AC.GeneeratedTextTransformation.TransformText()
在 Microsoft.VisualStudio.TextTemplate.TransformationRunner.RunTransformation(TemplateProcessingSession 会话、字符串源、ITextTemplateEngineHost 主机、字符串& 结果)

Updated

My DbContext 派生类如下所示。

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

    }

问题是 DbContext 派生类(DataCatalog)无参数构造函数连接字符串问题。

在支持下@Pawel我已经解决了我的问题。 您只需为无参数构造函数提供连接字符串,如下所示。

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

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

        }  
    }

Note 1 :如果您位于单独的层(类库项目)中,那么您必须将连接字符串提供给应用程序配置 file.

Note 2 :完成所有更改后,您必须编译再次运行 T4 模板之前的项目

希望这对将来的人有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

首先使用 T4 模板进行实体框架代码 的相关文章

随机推荐