实体框架 - 包括未映射到数据模型中的表?

时间:2012-01-04 14:47:20

标签: asp.net entity-framework

我认为这个问题可能相当简单,但我一直在寻找并且无法找到我想要的东西。

我和我的团队正在为现有的Web应用程序添加一个新模块。我们已经有了一个现有的数据模型,它连接到我们的sql db,而且非常庞大......所以对于新模块,我直接从我们的数据库创建了一个新的EF数据模型,新模块的新表。这些新表通过外键引用我们现有的一些表,但是当我添加这些表时,需要为该表映射所有外键,以及它们的表和它们的表......这看起来像是一个巨大的混乱。

我的问题是,不是将旧表添加到数据模型中,因为我只引用现有表的ID用于外键目的,我可以在{{1}中的某处.Includes("old table")进行操作或者我应该返回并将这些表添加到模型中并删除所有关系?或者也许是其他一些我甚至都不知道的方法?

很抱歉缺少代码,这更像是一个逻辑问题,而不是特定的语法问题。

3 个答案:

答案 0 :(得分:2)

简单的答案是否定的。您不能包含不属于您的模型的实体(=未映射到您当前上下文使用的EDMX中)。

更复杂的答案是:在一些非常特殊的情况下,您可以,但它需要对您的开发过程以及您使用EF和EDMX的方式进行重大更改。您准备好将所有EDMX文件手动维护为XML吗?在这种情况下,EF提供了一种方法来引用另一个概念模型,并使用从新模型到旧模型的单向关系。这是一个骗子,因为您将拥有多个概念模型(CSDL),但单个映射文件(MSL),单个存储描述(SSDL)和使用所有这些的单个上下文。请查看this article以获取示例。

答案 1 :(得分:1)

我不知道您可以使用Include来引用EF图表之外的表格。要开始使用EF,您只需要包含数据库的一部分 - 如果您的第一个项目正在使用它可能的离散功能区域。当您导入和整个旧数据库时,这可能会解决令人担忧的混乱。我试图这样做时吓到了我。

在我们类似的情况下 - 一个使用存储过程的大型遗留系统,我们只添加了那时我们直接工作的表。稍后,您可以随时在需要时添加其他表。不要担心EF图中引用未包含的表的外键。实体框架乐于应对这一点。

它确实意味着运行两个业务层,一个用于实体框架,另一个用于旧式数据访问。不过对我们来说不是问题。事实上,从我读到的关于遗留系统编程的内容来看,它可能就是要走的路 - 你有一个业务层与你的邋old旧东西和一个业务层与你闪闪发光的新东西。继续从旧的到新的,直到有一天旧的业务层蒸发成任何东西。

答案 2 :(得分:0)

您必须对会员使用 [包含()]

例如:

        // This class allows you to attach custom attributes to properties
        // of the Frame class.
        //
        // For example, the following marks the Xyz property as a
        // required property and specifies the format for valid values:
        //    [Required]
        //    [RegularExpression("[A-Z][A-Za-z0-9]*")]
        //    [StringLength(32)]
        //    public string Xyz { get; set; }
        internal sealed class FrameMetadata
        {

            // Metadata classes are not meant to be instantiated.
            private FrameMetadata()
            {
            }
            [Include()]
            public EntityCollection<EventFrame> EventFrames { get; set; }

            public Nullable<int> Height { get; set; }

            public Guid ID { get; set; }

            public Layout Layout { get; set; }

            public Nullable<Guid> LayoutID { get; set; }

            public Nullable<int> Left { get; set; }

            public string Name { get; set; }

            public Nullable<int> Top { get; set; }

            public Nullable<int> Width { get; set; }
        }
    }

LINQ应该有

.Includes("BaseTable.IncludedTable")

语法。

对于不属于模型的实体,您必须创建一些视图类。