在使用CodeFluent实体在DESIGN TIME生成的对象模型时,我在Visual Studio 2013中遇到了问题。
它是第三方报告组件,可以绑定到POCO对象数据源,并具有从POCO数据源提供的返回对象集合中提供实时数据的附加功能。然后,它会在设计时的Visual Studio 2013中显示包含数据的报告的精彩预览。
我设置了一个指向对象数据源的报告,其中返回类型为CodeFluent Entities“Namespace”。“Entity”集合类型(我只使用默认生成的LoadAll函数并返回其调用)。
那么,我可以使这项工作正常。在DESIGN TIME,Visual Studio中的报表组件正确调用BOM中的LoadAll方法,并从持久层中检索数据。所有这些都在DESIGN TIME中(我的VS解决方案中没有任何项目可以运行以获取LoadAll并从数据库中检索数据),我不能强调这一点。这是我需要你帮助的地方。当我将SQL Server作为持久层使用时,我所描述的是有效的,但在使用MySql时却没有。
由于我在这里描述的所有功能都是在VS设计时,因此该报表组件使用特殊配置来实例化.NET类并从对象运行方法,而无需运行项目入口点。由于项目从未运行,因此它不会触发CodeFluent实体类的初始化代码以正确使用持久层。然后我创建一个新类,使用一个新函数,其中CodeFluent.Runtime.CodeFluentContext中的连接字符串是从头开始设置的。
实际上,这就是问题所在:
我有一个“特殊”类,其构造函数调用该函数作为报表组件的对象数据源,例如:
Public Class DuplicataLoadService
Public Function LoadByParams() As S5T.DuplicataCollection
Dim context As CodeFluentContext = CodeFluent.Runtime.CodeFluentContext.[Get](S5T.Constants.S5TStoreName)
context.Persistence.ConnectionString = "Data Source=MYCOMPUTER\SQLEXPRESS;Initial Catalog=duplicatas4t;User ID=user;Password=pwd"
LoadByParametros = S5T.DuplicataCollection.LoadAll
End Function
Public Sub New()
Me.LoadByParams()
End Sub
End Class
我将这个类称为“特殊”,因为它永远不会在运行时通过启动我的winforms项目来执行。我在它上面设置断点,它们永远不会被击中。此类仅在Visual Studio DESIGN TIME中使用。
我的App.config设置为使用SQL Server持久性,例如:
<configuration>
<configSections>
<section name="S5T" type="CodeFluent.Runtime.CodeFluentConfigurationSectionHandler, CodeFluent.Runtime" />
</configSections>
<S5T connectionString="Data Source=MYCOMPUTER\SQLEXPRESS;Initial Catalog=duplicatas4t;User ID=user;Password=pwd" />
</configuration>
在这种情况下,它运行正常,但是当我更改为使用MySql持久性时,它不再起作用(请帮助)。
**不工作,抛出一般异常***
Public Class DuplicataLoadService
Public Function LoadByParams() As S5T.DuplicataCollection
Dim context As CodeFluentContext = CodeFluent.Runtime.CodeFluentContext.[Get](S5T.Constants.S5TStoreName)
context.Persistence.ConnectionString = "Database=duplicatas4t;Server=localhost;Password=manager;User ID=root;pooling=true;"
LoadByParametros = S5T.DuplicataCollection.LoadAll
End Function
Public Sub New()
Me.LoadByParams()
End Sub
End Class
我的App.config设置为使用MySql持久性,例如:
<configuration>
<configSections>
<section name="S5T" type="CodeFluent.Runtime.CodeFluentConfigurationSectionHandler, CodeFluent.Runtime" />
</configSections>
<S5T persistenceTypeName="MySQL"
connectionString="Database=duplicatas4t;Server=localhost;Password=pwd;User ID=user;pooling=true;"
mysql-useSchemas="true" />
</configuration>
在这两种情况下,我都提到app.config仅作为ILLUSTRATION,因为app.config内容在项目执行触发时设置并在运行时获取。事实并非如此,我仅将app.config内容用作模型,以便我可以知道必须以编程方式设置为消耗持久层工作的设计时功能。
我怀疑在MySql时我必须以编程方式添加更多配置。
由于SQL Server是CodeFluent实体的默认设置,因此当app.config只有:
时<S5T connectionString......
它有效,我有一个相应的代码来以编程方式设置连接字符串,例如:
context.Persistence.ConnectionString = ....
当它是MySql时,除了connectionString之外,app.config中还有其他属性,例如:
<S5T persistenceTypeName="MySQL"....... mysql-useSchemas="true" />
我的初始化代码只有context.Persistence.ConnectionString = ....还不够....它有意义吗?
我如何以编程方式初始化persistenceTypeName和mysql-useSchemas属性?
作为最后的观察,消耗SQL Server和MySql的两种情况都在运行时正常工作,这表明在设置项目的app.config,持久性生成器等时我没有基本的配置错误。
提前致谢,
雷纳托
答案 0 :(得分:0)
在配置文件中,设置PersistenceTypeName
和一些特定的MySQL配置属性。默认情况下,PersistenceTypeName
设置为SQL Server
,并使用default connection string。这就是它在设计时与SQL Server一起工作的原因。
使用MySQL时,需要更改配置(PersistenceTypeName,Connection String等)。由于您无法在设计时使用配置文件,因此必须按代码设置配置。 CodeFluentConfiguration
中提供了context
个实例:
var context = CodeFluent.Runtime.CodeFluentContext.Get("S5T");
context.Configuration.PersistenceTypeName = "MySQL";
context.Configuration.Element.SetAttribute("mysql-UseSchema", "true");
必须在XML元素中设置提供者特定的属性,因为 generic 配置类中没有关联的属性。