DomainModel的数据库架构

时间:2009-03-12 01:30:32

标签: database-design code-generation domain-driven-design

有没有人有从c#(。net 3.5)域模型生成数据库模式的经验?哪个工具可以生成最干净的脚本?

Telerik OpenAccess ORM一切正常,但如果属性字段使用.net 3.5隐式私有字段,则它不会从c#类生成干净的列名。

我只需要一个初始脚本,然后我将手动增强和维护。

P

2 个答案:

答案 0 :(得分:2)

我刚刚通过反思生成了一个。一旦我开始考虑它,我想象的就会花费更少的精力。

我是怎么做到的(又名:算法)

  1. 加载程序集。

  2. 对于assembly =>中的每个类(Type)创建表

  3. 将主键生成为$ {className} ID

  4. 为类create =>中的每个get / set属性添加字段(将属性类型映射到数据库类型)

  5. 在class =>上获取外键自定义属性如果不存在则添加密钥。将其设置为fk_index(自定义属性签名类似于[ForeignKey(“TableA,TableB”)]

  6. 获取其他约束(例如:检查)自定义属性=>酌情生成

  7. 如果您无权访问源代码,请从xml中读取这些映射。 *****编辑:如果xml始终是最后一个选项解决方案(对我而言),您可以在返回IEnumerable< Attribute>的类上创建扩展方法。在这种情况下,您的属性表面必须包含'string TargetProperty {get; set;}'用于存储在检查和唯一约束的情况下引用的字段名称的属性。*****

  8. 就是这样!!

    提示:

    组装:哦!顺便说一句,一个常见的问题是确保在加载程序找到它们的地方提供所有程序集依赖关系。请记住,Visual Studio无法帮助您解决此动态加载方案中的依赖关系。想想你在命令行上运行csc.exe。如果遇到程序集加载问题,请检查以确保加载程序可以找到域模型程序集的每个内部依赖项。

    TYPE MAPPING:Nullable类型设置为NULL,否则为NOT NULL类型。字符串类型设置为nvarchar(max)。根据需要将钱映射到十进制或双精度,将bool映射到位或等效,将DateTime映射到datetime,将byte []映射到二进制,将long映射到数字(x,0)并将int映射到int。

    APP体系结构:我很容易为我的解决方案添加一个控制台应用程序以满足当前的需求,但是,您可能希望提供输入参数以确保这可以轻松移植到其他项目。为了平滑这一点,你需要代码生成程序有一个dll部分,它将声明你的自定义属性,否则你可能还想传入类型规范或设置自定义属性的配置部分前者似乎更容易使用和配置再次,codegen程序确切地知道它正在回来的内容。

    希望这有帮助。

    P

答案 1 :(得分:0)

P,

我使用了Reflection,Introspection(FxCop SDK)和CodeModel(Visual Studio Automation)来解决similar problem。我按顺序从一个API转到下一个API,最喜欢CodeModel。 Reflection的问题在于,只要加载AppDomain,它就会将程序集锁定在内存中。这是T4中的一个问题,尽管您的独立可执行文件可能没有它。使用T4,您无法在从元数据生成代码后重新编译原始程序集。内省运行良好,没有锁定程序集,但它仍然没有记录,而且它要求您在使用其元数据之前编译程序集。 CodeModel都有文档记录,允许您直接从C#源代码访问元数据。

希望这有帮助, 奥列格