草庐IT

c# - 如何在 C# 中表示 MySQL 数据库模式?

coder 2023-10-06 原文

标题不太准确,但我想不出更好的。

我正在尝试为 MS 的 Forefront Identity Manager 编写 MySQL 连接器(FIM 基本上是一个同步引擎,它使用元目录同步各种数据源之间的身份)。但是我很难想出一个合适的设计。

假设我想将用户数据从 db 导入到 FIM 的元节中。用户对象具有各种属性,如名字、姓氏、地址等。在数据库中,这些属性可以分布在多个表之间。 FIM 最终需要将这些属性合并为一个对象。所以用户需要配置连接器来告诉它数据是如何存储在数据库中的。

我想知道表示这种配置的“最佳”方式是什么。 (我)想到了两种选择:

  • 我可以只保存一个合并/连接数据的选择查询,这样结果就是一个包含所有所需属性的“表”。问题在于我认为我必须对这个查询字符串进行某种解析才能从中创建一个 fim-compatible-schema(这基本上是对象类型的名称(fe“person”)和属性列表)。这个架构需要单独从查询字符串创建,而无需实际执行查询(如果可以简化流程,我可以执行一些假查询)。
  • 我可以创建一些类来表示数据库模式,即表和关系。由于我对 MySQL(或根本没有数据库)经验不足,因此我冒着遗漏一些特殊情况的风险。这也可能是某种矫枉过正,因为一旦配置了架构,就可以假定它是固定的。

  • 有没有人对选择哪种替代方案以及如何解决随之而来的问题有相同的建议?或者还有另一种 - 更好 - 我没有想到的选择?任何建议将不胜感激!
    如果有什么不清楚的,请告诉我。

    编辑 :由于用例上有一些问题,我将详细说明一下:

    正如我所说,我正在为 FIM 开发管理代理。 FIM 提供了一个所谓的可扩展连接管理代理,它基本上是一个实现几个接口(interface)的单一类。 (有关示例实现,请参阅 this technet guide)。

    因为我想开发一个通用代理来管理 MySQL 中的身份。数据库,我不知道编译时的数据库布局。当最终用户想要使用管理代理时,他需要决定他想要管理身份的哪些属性。所以我需要给用户一些方法来配置管理代理。我的主要问题是,如何设计类来保存此配置。

    让我们看一个简单的例子:

    假设您要管理员工身份。为了简单起见,我们有三个属性:
  • 名字
  • 姓氏
  • 部门

  • 在这个例子中,它可能是 f.e.只有一个有 4 列的表(属性加一个 id)。但它也可能是更好的设计,它使用两张表,一张用户表和一张部门表,使用 1:1 的关系来定义用户部门。

    FIM 要求我将这些属性合并到一个对象中。它提供了一个类 CSEntryChange其中有一个 AttributeChanges收藏成员(member)。然后我会创建一些 AttributeChange 的实例(它基本上包含属性名称和它的值)并将它们添加到集合中。因此,用户可编辑的配置必须告诉管理代理它如何从 db 获取具有所有定义属性的用户。和 如何在该数据库中创建和修改用户。

    所以理想情况下,我会有一个“MySQLSchema”类的实例(由用户预先配置),它可以返回 List<CSEntryChange> (为了解耦,我实际上不会使用 CSEntryChange 类,但您应该明白这一点)包含数据库中的所有用户(可能需要分页,但我可以稍后弄清楚)。此外,我希望能够将它传递给 CSEntryChange这将导致相应的数据库条目被更新(或创建,如果尚不存在)。

    我希望这更清楚一点:)

    最佳答案

    我认为您真正的问题是,“ 如何通过 C# 访问 MySQL 实体?

    首先,我希望您将其构建为 MVC application .

    为了学习和易于实现,我建议坚持使用完整的 Microsoft 堆栈。

    考虑到这一点,您需要按照以下步骤创建 EntityFramework MySQL 数据提供程序:

  • 通过 Nuget 包管理器 UI 或包管理器控制台,通过键入 Install-Package EntityFramework -Version 6.0.2(并从您的 Web 项目添加对此项目的引用)创建一个新项目和 EntityFramework。在页面下方查看“配置 EntityFramework 以使用 MySQL 数据库”。
  • 通过 Nuget 包管理器 UI 或通过在包管理器控制台中键入 Install-Package MySql.Data.Entity 来安装 Entity Framework 的 MySQL 提供程序

  • 下一步需要了解数据库配置更改,这些更改非常详细here - Configure EntityFramework to work with a MySQL database .

    您应该最终得到一个很好的类结构,它允许您通过 EF 遍历实体的导航属性。

    根据您的应用程序所需的安全级别,您可能还想创建 data transfer objects (DTOs)只包含远程调用所需的数据 - 保持数据调用高效。

    这绝不是关于如何做到这一点的权威指南,但希望能让您朝着正确的方向开始。

    关于上面的第 1 步:

    I could just save a select query that merges/joins the data, so that the result is a single “table” with all the desired attributes. The problem with this is that I think I would have to do some kind of parsing on this query-string to create a fim-compatible-schema out of it (which is basically the name of the object type (f.e. “person”) and a list of attributes). This schema needs to be creatable from the query-string alone without actually executing the query (I could execute some fake queries if that would simplify the process).



    我对此感到有些困惑。您是说要根据应用程序请求动态更新数据库架构吗?

    关于c# - 如何在 C# 中表示 MySQL 数据库模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21087263/

    有关c# - 如何在 C# 中表示 MySQL 数据库模式?的更多相关文章

    1. ruby - 如何在 Ruby 中顺序创建 PI - 2

      出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

    2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

      我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

    3. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

      如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

    4. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

      我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

    5. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

      我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

    6. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

      exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

    7. ruby - 如何在续集中重新加载表模式? - 2

      鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

    8. ruby - 如何在 Ruby 中拆分参数字符串 Bash 样式? - 2

      我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"

    9. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

      我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

    10. ruby-on-rails - 如何在 ruby​​ 交互式 shell 中有多行? - 2

      这可能是个愚蠢的问题。但是,我是一个新手......你怎么能在交互式ruby​​shell中有多行代码?好像你只能有一条长线。按回车键运行代码。无论如何我可以在不运行代码的情况下跳到下一行吗?再次抱歉,如果这是一个愚蠢的问题。谢谢。 最佳答案 这是一个例子:2.1.2:053>a=1=>12.1.2:054>b=2=>22.1.2:055>a+b=>32.1.2:056>ifa>b#Thecode‘if..."startsthedefinitionoftheconditionalstatement.2.1.2:057?>puts"f

    随机推荐