当前位置: 首页 > 编程语言 > C#

如何在C#中表示MySQL数据库模式?分享

时间:2023-04-10 15:34:41 C#

C#中如何表示MySQL数据库模式?标题不是那么准确,但我想不出更好的。我正在尝试为MS的ForefrontIdentityManager编写一个MySQL连接器(FIM基本上是一个同步引擎,它使用元目录来同步各种数据源之间的身份)。但是我找不到合适的设计。假设我想将用户数据从数据库导入到FIM的元节中。用户对象具有各种属性,如名字、姓氏、地址等。在数据库中,这些属性可以分布在多个表中。FIM最终需要将这些属性组合成一个对象。因此,用户需要配置连接器来告诉它数据是如何存储在数据库中的。我想知道表示此配置的“最佳”方式是什么。有两个选项(我的):我可以保存一个合并/连接数据的选择查询,以便结果是一个具有所有所需属性的“表”。这个问题是我认为我必须对此查询字符串进行某种解析才能从中创建FIM兼容性模式(基本上是对象类型的名称(fe“person”)和属性列表).这个模式需要单独从查询字符串创建,而不需要实际执行查询(如果这样可以简化过程,我可以做一些假查询)。我可以创建类来表示数据库模式,即表和关系。由于我不熟悉MySQL(或根本不熟悉数据库),因此我冒着遗漏某些特殊情况的风险。此外,这可能有点矫枉过正,因为一旦配置了模式,就可以假定它是固定的。有没有人对选择哪种替代方案以及如何解决随之而来的问题有任何建议?还是有我没有想到的另一种-更好的-替代方案?任何建议将不胜感激!如果有什么不清楚的地方,请告诉我。编辑:由于我对用例有一些疑问,我将详细说明:正如我所说,我正在为FIM开发管理代理。FIM提供了所谓的可扩展连接管理代理,它基本上是实现某些接口的单个??类。(有关示例实施,请参阅此技术指南)。因为我想开发一个通用代理来管理MySQL数据库中的身份,所以我不知道编译时的数据库布局。当最终用户想要使用管理代理时,他需要决定他想要管理身份的哪些属性。所以我需要给用户一些配置管理代理的方法。我的主要问题是,如何设计类来保存此配置。让我们看一个简单的示例:假设您要管理员工身份。为简单起见,我们有三个属性:在这个例子中,它可能只是一个有4列的表(属性加一个id)。但它也可能是一个更好的设计,使用两个表,一个用户表和一个部门表,使用1:1关系来定义用户部门。FIM要求我将这些属性组合到一个对象中。它提供了一个CSEntryChange类,它有一个AttributeChanges集合成员。然后我将创建一些AttributeChange实例(基本上包含属性名称及其值)并将它们添加到集合中。因此,用户可编辑的配置必须告诉管理代理如何从数据库中获取具有所有已定义属性的用户以及如何在该数据库中创建和修改用户。理想情况下,我有一些“MySQLSchema”类(由用户预先配置)会返回一个列表(我实际上不会使用CSEntryChange类来解耦,但您应该获得包含数据库中所有用户的视图(分页可能是一个要求,但我可以稍后解决。另外,我希望能够传递CSEntryChange,这将导致相应的数据库条目被更新(或创建,如果不存在的话)。我希望这是清楚:)我认为你真正的问题是,“如何从C#访问MySQL实体?”首先,我希望您将其构建为MVC应用程序。为了学习和易于实施,我建议坚持使用完整的Microsoft堆栈。考虑到这一点,您将需要按如下方式创建EntityFrameworkMySQL数据提供程序:通过Nuget包管理器UI或通过键入Install-PackageEntityFramework-Version6.0.2的包(并从Web添加对此项目的引用)project)ManagerConsole创建新项目和EntityFramework。中途查看“ConfiguringEntityFrameworktouseaMySQLdatabase”页面。通过Nuget程序包管理器UI或在程序包管理器控制台中键入Install-PackageMySql.Data.Entity为实体框架安装MySQL提供程序下一步需要了解数据库配置更改,此处详述-配置EntityFramework以使用MySQL数据库。您最终应该得到一个不错的类结构,它允许您通过EF迭代实体的导航属性。根据您的应用程序所需的安全级别,您可能还需要创建仅包含远程调用所需数据的数据传输对象(DTO)-保持数据调用有效。这绝不是有关如何执行此操作的权威指南,但希望能为您提供一个正确方向的起点。关于上面的第1步:我可以保存一个合并/连接数据的选择查询,以便结果是一个包含所有所需属性的“表”。这个问题是我认为我必须对此查询字符串进行某种解析才能从中创建FIM兼容性模式(基本上是对象类型的名称(fe“person”)和属性列表).这个模式需要单独从查询字符串创建,而不需要实际执行查询(如果这样可以简化过程,我可以做一些假查询)。我有点困惑。您的意思是根据数据库模式动态更新应用程序请求?您可以将NHibernate与MySQL一起使用,NHibernate是一个功能齐全的ORM,其中C#类映射到您的MySQL表,一旦您掌握了NHibernate的窍门,其余的将是小菜一碟。这是一个供您参考的示例。http://www.codeproject.com/Articles/26123/NHibernate-and-MySQL-A-simple-example当您使用MySQLConnector/Net时,您还可以像MSDN中的这个示例一样使用实体框架:使用(vardb=newBloggingContext()){//创建并保存一个新的博客Console.Write("EnteranameforanewBlog:");varname=Console.ReadLine();varblog=newBlog{名称=名称};db.Blogs.Add(博客);db.SaveChanges();我有一些.NETMySQL通信的经验,过去我使用EntityFramework进行通信-我遇到了很多问题和性能问题,很快就后悔了使用它(那是1-2年前,他们可能会修复它.当然,使用ORM框架会在数据库通信之上添加一个层,在我的例子中,这在性能和灵活性方面被证明是不可取的。最后,我选择采用以下方法:1)使用POCO类创建模型,就像使用EntityFramework一样。这些模型可能包含也可能不包含关系——这取决于您的偏好。我更喜欢只在实际需要时添加关系(因此某些对象在POCO中可能有自己的数据库关系,有些可能没有)。我选择这个是因为它减少了何时预加载关系以及何时预加载关系的复杂性。基本上,如果您不需要它-不要添加它。2)创建一个接受和使用这些对象的DAL层(例如,使用存储库模式)并向MySQL发出直接查询。这不需要EF-您只需要为MySQL安装Connector/NET就可以了。一个简单的例子如下(注意:这个例子不是我想出来的,只是为了说明这个类。我还会使用命令参数来防止注入等):publicclassPerson{publicstringName{get;设置;}}公共接口IPersonRepository{voidAddPerson(Personp);}publicclassPersonRepository{publicvoidAddPerson(Personp){using(varconnection=newMySqlConnection("someconnectionstring"){connection.Open();varcommand=newMySqlCommand(connection);command.Text=string.Format("insertintoPerson(Name)values({0})",p.Name)lcommand.ExecuteNonQuery();}}}这种做法对我来说好处是:当然,主要的坏处是多工作-您将“免费”获得实体框架的一些东西。因此,我可以推荐以下内容:祝您好运!首先使用实体??框架代码。http://msdn.microsoft.com/en-us/data/jj193542.aspx这仍然是很多工作,但我认为这是最快的方法。基于用户创建C#类并从这些类创建数据库架构。以上就是C#学习教程:如何在C#中表示MySQL数据库模式?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: