ASP.Net Linq to Entities:无法加载指定的元数据资源。- EntityConnectionStringBuilder

发布于 2024-12-21 23:27:35 字数 1528 浏览 3 评论 0原文

我已经阅读了很多帖子,但这似乎非常有用,但我不确定我是否理解如何实现这个解决方案。我是否应该将此代码放入使用实体模型的每个类中?我已经阅读了 Microsoft 文档,我想我对此还太陌生。

我的实体模型位于我的 DATALAYER 中,这是一个单独的项目。我还有业务逻辑层和用户界面层。从我收集到的信息来看,问题似乎与我的实体模型位于不同的项目中这一事实有关。是这样吗?提前致谢!

来自另一篇文章构造连接字符串的更好方法是使用EntityConnectionStringBuilder:

public static string GetSqlCeConnectionString(string fileName) 
{ 
    var csBuilder = new EntityConnectionStringBuilder(); 

    csBuilder.Provider = "System.Data.SqlServerCe.3.5"; 
    csBuilder.ProviderConnectionString = string.Format("Data Source={0};", fileName); 

    csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl",  
        typeof(YourObjectContextType).Assembly.FullName); 

    return csBuilder.ToString(); 
} 

public static string GetSqlConnectionString(string serverName, string databaseName) 
{ 
    SqlConnectionStringBuilder providerCs = new SqlConnectionStringBuilder(); 

    providerCs.DataSource = serverName; 
    providerCs.InitialCatalog = databaseName; 
    providerCs.IntegratedSecurity = true; 

    var csBuilder = new EntityConnectionStringBuilder(); 

    csBuilder.Provider = "System.Data.SqlClient"; 
    csBuilder.ProviderConnectionString = providerCs.ToString(); 

    csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl", 
        typeof(YourObjectContextType).Assembly.FullName); 

    return csBuilder.ToString(); 
} 

I have read through quite a few of the posts but this appears very useful but I'm not sure I understand how to implement this solution. Am I supposed to put this code in every class that uses the entity model? I've read through the Microsoft docs and I guess I'm just too new at this.

My entity model is in my DATALAYER which is a separate project. I also have BUSINESSLOGIC AND UI layers. From what I've been able to glean, it sounds like the problem is related to the fact that my entity model is in a different project. Is that right? Thanks in advance!

From another post A better way to construct connection strings is with EntityConnectionStringBuilder:

public static string GetSqlCeConnectionString(string fileName) 
{ 
    var csBuilder = new EntityConnectionStringBuilder(); 

    csBuilder.Provider = "System.Data.SqlServerCe.3.5"; 
    csBuilder.ProviderConnectionString = string.Format("Data Source={0};", fileName); 

    csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl",  
        typeof(YourObjectContextType).Assembly.FullName); 

    return csBuilder.ToString(); 
} 

public static string GetSqlConnectionString(string serverName, string databaseName) 
{ 
    SqlConnectionStringBuilder providerCs = new SqlConnectionStringBuilder(); 

    providerCs.DataSource = serverName; 
    providerCs.InitialCatalog = databaseName; 
    providerCs.IntegratedSecurity = true; 

    var csBuilder = new EntityConnectionStringBuilder(); 

    csBuilder.Provider = "System.Data.SqlClient"; 
    csBuilder.ProviderConnectionString = providerCs.ToString(); 

    csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl", 
        typeof(YourObjectContextType).Assembly.FullName); 

    return csBuilder.ToString(); 
} 

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

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

发布评论

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

评论(1

冷月断魂刀 2024-12-28 23:27:35

您可以将连接详细信息移至配置文件吗?这是一篇关于连接字符串的文章。并遵循与本文中相同的示例,这里是上下文的初始化和使用:

using (EntityConnection connection =  EntityConnection("name=AdventureWorksEntities"))
{
    AdventureWorksEntities context = new AdventureWorksEntities(connection);
    context.AddObject("Customer", customer);
    context.SaveChanges();
}

编辑:无需在调用客户端中重复连接构建代码。您应该向呼叫者隐藏这些详细信息。以下是返回新对象上下文的工厂示例:

//app.config
<connectionStrings>
    <add name="TestEntities" connectionString="...." />
</connectionStrings>

//data entities
public partial class TestEntities : ObjectContext
{
    public TestEntities() : base("name=TestEntities", "TestEntities")
    {
        ...
    }
    ....
}

//factory in Data Access layer
public sealed class TestEntitiesFactory
{
    public static Func<TestEntities> GetNewTestEntitiesInstance { get; set; }

    static TestEntitiesFactory()
    {
        GetNewTestEntitiesInstance = TestEntitiesCreator.CreateTestEntities;
    }
}

public sealed class TestEntitiesDefaultCreator
{
    public static TestEntities CreateTestEntities()
    {
        TestEntities test = new TestEntities();

        //whatever initializations you need

        return test;
    }
}

//business layer
using (TestEntities ctx = TestEntitiesFactory.GetNewTestEntitiesInstance())
{

}

Can you move connection details to your config files? Here is an article about connection strings. And following the same examples as in the article, here is the initialization and use of the context:

using (EntityConnection connection =  EntityConnection("name=AdventureWorksEntities"))
{
    AdventureWorksEntities context = new AdventureWorksEntities(connection);
    context.AddObject("Customer", customer);
    context.SaveChanges();
}

EDIT: there is no need to repeat the connection building code in the calling clients. You should hide these details away from the callers. Here is example of the factory that returns new object context:

//app.config
<connectionStrings>
    <add name="TestEntities" connectionString="...." />
</connectionStrings>

//data entities
public partial class TestEntities : ObjectContext
{
    public TestEntities() : base("name=TestEntities", "TestEntities")
    {
        ...
    }
    ....
}

//factory in Data Access layer
public sealed class TestEntitiesFactory
{
    public static Func<TestEntities> GetNewTestEntitiesInstance { get; set; }

    static TestEntitiesFactory()
    {
        GetNewTestEntitiesInstance = TestEntitiesCreator.CreateTestEntities;
    }
}

public sealed class TestEntitiesDefaultCreator
{
    public static TestEntities CreateTestEntities()
    {
        TestEntities test = new TestEntities();

        //whatever initializations you need

        return test;
    }
}

//business layer
using (TestEntities ctx = TestEntitiesFactory.GetNewTestEntitiesInstance())
{

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