在设计时间使用 CodeFluent 实体生成的对象模型时,我在 Visual Studio 2013 中遇到问题。
它是一个第 3 方报告组件,可以绑定到 POCO 对象数据源,并增加了从 POCO 数据源提供的返回的对象集合中传递实时数据的功能。然后它在设计时间在 Visual Studio 2013 中显示带有数据的报表的漂亮预览。
我设置了一个指向对象数据源的报告,其中返回类型是 CodeFluent Entities "Namespace"."Entity"Collection 类型(我只是使用默认生成的 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 作为说明,因为 app.config 内容是在项目执行触发时在运行时设置和获取的。情况并非如此,我仅将 app.config 内容用作模型,以便我可以知道必须以编程方式设置哪些内容才能使用持久层工作的设计时功能。
我怀疑当它是 MySql 时,我必须以编程方式添加进一步的配置。
由于 SQL Server 是 CodeFluent 实体的默认设置,因此当 app.config 只有:
<S5T connectionString......
它有效,我有相应的代码来以编程方式设置连接字符串,例如:
context.Persistence.ConnectionString = ....
当它是MySql时,app.config中除了connectionString之外还有其他属性,例如:
<S5T persistenceTypeName="MySQL"....... mysql-useSchemas="true" />
我的初始化代码只有 context.Persistence.ConnectionString = .... 是不够的.... 这有意义吗?
如何以编程方式初始化 persistenceTypeName 和 mysql-useSchemas 属性?
作为最后的观察,使用SQL Server和MySql的两种情况在运行时都正常工作,说明我在设置项目的app.config、持久化生产者等时没有出现基本配置错误......
提前致谢,
雷纳托