【问题标题】:Is there a .NET Polymorphic Data Framework是否有 .NET 多态数据框架
【发布时间】:2011-01-05 03:58:21
【问题描述】:

我正在开始一个新项目,如果有某种方法可以使不同的数据模型具有多态性,那将会容易得多。我正在考虑使用 Entity Framework 4.0(当它发布时),但无法确定它是否真的能够工作。

这是基本场景。我实现了一个评论系统,并希望能够将它连接到许多不同类型的模型。也许我想要一个人的个人资料上的 cmets 和网页上的 cmets。过去我会这样做的方式是在人员表和评论表之间创建关系,与网页表和评论表之间的关系分开。然而,我认为这会导致数据库中的表结构过于复杂。

如果我能够为我想要 cmets 的对象添加一个接口,然后将数据库中的表结构简化为单个关系,那将是最好的。

我遇到的问题是我似乎不知道正确的术语来查找有关如何执行此类操作的信息。任何人都可以提供任何帮助将不胜感激。

【问题讨论】:

    标签: c# .net database-design ado.net polymorphism


    【解决方案1】:

    如果您将“cmets 表”设计为与注释类型无关(只是基础知识,如 id、日期和时间以及文本内容),那么您可以使用一个附加表来映射它们。

    public interface ICommentable
    {
       int CommentTypeCode
       int Id
       ...
    }
    

    现在映射表包含列:

    • comment_type_code
    • target_object_id
    • comment_id

    您的 cmets 都放在一张桌子上,带有一个 Id 您的各种“目标对象”必须都具有相同类型的 Id

    现在您可以在系统中任意添加新的“可注释”对象,而无需更改 cmets 表或映射器表 - 只需为其分配一个新的类型代码并创建具有必需 Id 列的表。

    【讨论】:

    • 是的,这正是我所想的类型。我希望可能有一种方法可以透明地处理类型转换,但看起来我将不得不硬着头皮去做。在这种情况下,我必须检查 target_object_id 以及 comment_type,这可能只是目标对象的 System.Type。我不需要做很多工作,所以看来我要学习了。
    • 好吧,这是假设您的目标是减少数据库中的表数量,这是我从原始问题中收集的。我可能倾向于为每种评论类型创建“映射表”,但仍将所有 cmets 保留在评论表中。如果您有一个带有 post_id 列和 comment_id 列的“post_cmets”表,您可以在视图或模型需要特定帖子 id 的 cmets 时进行查询——无需类型转换。
    • 是的,没错,就是减少表的数量,减少需要编写的代码量。在一个完美的世界中,它可以像 Ruby 的 mix-ins 一样工作,但在 C# 中这实际上是不可能的。这没什么大不了的,我只是希望我错过了什么。
    【解决方案2】:

    我使用 LinqToSql 和部分类来完成此操作。对于我想要实现接口的每个类,我都会创建一个非工具生成的文件,其中包含声明要实现接口的类的部分类的一部分。

    例如:

    生成的代码:

    // this code is generated by a tool blah blah
    partial class FooComment {
        // all the generated crap
        string Author {
            // ...
        }
        // etc
    }
    

    界面:

    interface IComment{
        string Author{ get; }
        // etc
    }
    

    我的代码:

    // lovingly hand-written by me
    partial class FooComment : IComment {
    }
    

    现在,如果您想将任何一组 FooComment 转换为 IComment,请使用 Cast linq 扩展方法:

    db.FooComments.Cast<IComment>()
    

    【讨论】:

    • 是的,这就是我正在考虑的解决方案类型。我希望有一种方法可以透明地处理类型转换,但通用函数可能是我能得到的最好的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 2012-08-13
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    相关资源
    最近更新 更多