ADO.NET EF + CF:如何使用现有的CF上下文并绑定SQL外部对象(视图、存储过程等)?

发布于 2025-01-08 16:01:30 字数 2431 浏览 0 评论 0原文

我有一个数据库,90% 是在 SQL Server 2012 上使用 EF 4.1 + Code First 方法创建的;其余部分由一些 SQL 代码(函数、计算列、视图、索引等)生成。

现在,我需要使用ObjectContext,同时优化性能,所以我直接在数据库中创建了一些SQL视图,这基本上完成了对已生成的 CF 表格进行一些计算(计数、混合、求和等)。

我想在我的解决方案中使用上述“外部”SQL 视图,可能指向我的 CF 上下文的相同的连接字符串,并与我创建的相同存储库一起使用。 我成功制作了视图的 ADO.NET EDM (这是正确的方法吗?),所以现在我有了从 db 生成的实体模型。 由于上述原因,首先我使用了现有的数据连接,并且选择不在 web.config 中保存附加连接字符串。

现在我有了包含我的“外部”视图的Model 和我的Model.Storeedmx。例如,这里是 mymodel.Designer.cs 的摘录,这似乎是我在其他项目的其他 edmx 中看到的标准摘录:

 public partial class Entities : ObjectContext
{
    #region Constructors

    /// <summary>
    /// Initializes a new Entities object using the connection string found in the 'Entities' section of the application configuration file.
    /// </summary>
    public Entities() : base("name=Entities", "Entities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

    /// <summary>
    /// Initialize a new Entities object.
    /// </summary>
    public Entities(string connectionString) : base(connectionString, "Entities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

    /// <summary>
    /// Initialize a new Entities object.
    /// </summary>
    public Entities(EntityConnection connection) : base(connection, "Entities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

    #endregion
    .............

我想查询“外部”实体。我做了几次测试,但没有成功。 您能告诉我解决问题的正确方法吗?

1)这是我所做的测试之一。在这种情况下,我得到一个异常“指定的命名连接要么在配置中找不到,不打算与 EntityClient 提供程序一起使用,要么无效”:

 public class TManagerRepository : ITManagerRepository, IDisposable
   {
    private TManagerContext context; // the context pointing to CF entities
    private TManager.Models.Entities.SQL_Views.Entities entities; // the context pointing to the SQL views by the EDM

    public TManagerRepository(TManagerContext context)
    {
        this.context = context;
        this.entities = new TManager.Models.Entities.SQL_Views.Entities();

        var test = (from d in this.entities.myview
                        select d); 
    }

2)然后我也尝试建立特定的连接,但我得到出现“无法找到要验证的概念模型”的异常。

非常感谢您的宝贵帮助!

此致

I have a database, 90% created with EF 4.1 + Code First approach on a SQL Server 2012; the rest is generated by some SQL code (FUNCTIONS, COMPUTED COLUMNS, VIEWS, INDEXES, ETC.).

Now, I needed to use ObjectContext and at the same time optimize performance, so I created some SQL Views directly in the db, which basically do some calculations (count, mix, sum, etc.) on the already CF's generated tables.

I'd like to use the above "external" SQL views inside my solution, possibly pointing to the same connectionstring of my CF context and using with the same repository I created.
I succeed to make an ADO.NET EDM of the Views (is this the right approach?), so now I have the Entity Model generated from db.
For the reasons described above, in first instance I used the existing data connection and I choose to do not save the additional connection string inside my web.config.

Now I have the edmx containing myModel and myModel.Store of the "external" views. For example, here's an extract of mymodel.Designer.cs, which seems to be the standard one I've seen in other edmx of other projects:

 public partial class Entities : ObjectContext
{
    #region Constructors

    /// <summary>
    /// Initializes a new Entities object using the connection string found in the 'Entities' section of the application configuration file.
    /// </summary>
    public Entities() : base("name=Entities", "Entities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

    /// <summary>
    /// Initialize a new Entities object.
    /// </summary>
    public Entities(string connectionString) : base(connectionString, "Entities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

    /// <summary>
    /// Initialize a new Entities object.
    /// </summary>
    public Entities(EntityConnection connection) : base(connection, "Entities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

    #endregion
    .............

I'd like to query the "external" entities. I did several tests, but I did not succeed.
Could you tell me the right approach to the problem, please?

1) This is one of the tests I made. In this case I get an exception "The specified named connection is either not found in the configuration, not intended to be used with the EntityClient provider, or not valid":

 public class TManagerRepository : ITManagerRepository, IDisposable
   {
    private TManagerContext context; // the context pointing to CF entities
    private TManager.Models.Entities.SQL_Views.Entities entities; // the context pointing to the SQL views by the EDM

    public TManagerRepository(TManagerContext context)
    {
        this.context = context;
        this.entities = new TManager.Models.Entities.SQL_Views.Entities();

        var test = (from d in this.entities.myview
                        select d); 
    }

2) Then I tried to make a specific connection too, but I get an exception which says "Could not find the conceptual model to validate".

Thank you very much for your precious help!

Best Regards

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

新一帅帅 2025-01-15 16:01:30

您不能对代码优先方法和 EDMX 使用相同的连接字符串。所需的连接字符串具有不同的格式。因此,如果您不想在配置文件中存储 EDMX 上下文的连接字符串,则必须

You cannot use same connection string for code first approach and for EDMX. Required connection strings have different format. So if you don't want to store connection string for EDMX context in your configuration file you must to built it manually.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文