【问题标题】:Can a class derived from a Linq to SQL entity still be saved?从 Linq to SQL 实体派生的类仍然可以保存吗?
【发布时间】:2010-08-11 09:52:43
【问题描述】:

说“Foo”是在 Linq to SQL 设计器中创建的 Linq to SQL 实体。

然后我得到了源自“Foo”的“Bar”。

我是否可以使用 Linq to SQL 保存“Bar”(假设我不在乎保存 Bar 上的任何额外属性)。

        using (myDataContext ctx = new myDataContext())
        {
            ctx.Foos.InsertOnSubmit(instanceOfBar);
            ctx.SubmitChanges();
        }

这应该被支持吗?

非常感谢, 乔恩

【问题讨论】:

    标签: linq-to-sql


    【解决方案1】:

    我曾尝试过这样做,但无法正常工作。不记得抛出了什么错误,但要解决它,我基本上必须使用反射遍历所有属性并将标有 ColumnAttribute 的属性复制到一个新的基类实例中,然后将其插入。它不漂亮,但它有效。自从我实施以来,我没有重新调查过这个问题,所以如果有更好的方法,我很想知道。

    【讨论】:

    • 据我所知,除了重新实现映射源之外,这确实是唯一的方法。 Linq to Sql 的 AttributeMapping 的默认实现只检索基本类型本身的各种属性(TableAttribute、ColumnAttribute 等),它忽略了继承的任何内容。
    • 这很有趣,在我发布这个之后,我发现它不受支持并下载了 automapper automapper.codeplex.com 以将我的派生实体映射到基类的新实例。 (与您发现的相似)效果很好。我还使用在保存之前触发的事件扩展了我的基类,以便派生类将其扩展数据序列化为 xml(保存到基类架构中的 xml 列中)。
    【解决方案2】:

    我不确定,但你为什么要这样做?实体都是作为部分类实现的,那你为什么不在部分类中实现你想要的呢?

    【讨论】:

    • 原因是我希望 Linq to SQL 代码位于一个库/dll 中,我可以在许多应用程序和使用该库的应用程序中重用它我想用应用程序扩展实体具体知识。
    • 然后我将实现一个存储库模式:不要将 Linq To SQL 数据上下文公开,将其标记为内部。在它上面有一个薄的包装器(存储库)然后暴露它。存储库方法可以将扩展类转换为数据上下文的基本实体。
    【解决方案3】:

    我是存储库模式的忠实拥护者,这意味着我在一个隔离的 dll (project.Models.dll) 中定义我的模型,然后为我的 IRepository 创建一个 LinqToSql 实现。

    linq 类仅存在于 LinqToSql 实现 dll 中,我创建扩展方法以从我的模型转换为 linq 实体,反之亦然。

    我发现这使您能够测试系统的更多部分,而不会过度依赖数据库。虽然有点痛苦,但每个项目只做一次。

    这意味着您可以完全控制对象的序列化,并且可以对它们做任何您喜欢的事情

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      • 2010-11-23
      • 2011-05-21
      相关资源
      最近更新 更多