簡體   English   中英

不同的實體框架模型中不能有相同的表名?

[英]Can't have the same table names in different entity framework models?

我的應用程序使用兩個不同的SQL 2008數據庫 數據庫有幾個具有相同名稱的表,即。 Users 我想將EF4用於這兩個數據庫。 但是,當我運行我的應用程序並且它遇到第二個數據庫的objectcontext創建時,我收到以下錯誤:

名稱為“User”的多個類型存在於不同名稱空間中的EdmItemCollection中。 基於約定的映射需要唯一的名稱,而不考慮EdmItemCollection中EdmItemCollectionto命名空間中的命名空間

這是否意味着我不能在同一個應用程序中使用兩個具有(部分)相同表名的數據庫? 它們位於不同的名稱空間,不同的edmx模型,不同的項目等。

PS其中一個模型是設計者生成的並使用POCO類,另一個是從數據庫中推斷出來並與EF緊密耦合。

要使用“基於默認約定的映射”,以下兩種方法將起作用:

1)使用通配符連接字符串導致沖突:

    metadata=res://*/Repositories.EntityFramework.Model.csdl|res://*/Repositories.EntityFramework.Model.ssdl|res://*/Repositories.EntityFramework.Model.msl;

由於*不適用於您的項目,您可以定義多個連接字符串以對包含edmx的程序集進行硬編碼。

2)創建一個幫助器

    public static EntityConnection GetEfConnectionString(this string sqlConnectionString)
    {
        var cs = string.Format(@"metadata=res://{0}/Repositories.EntityFramework.Model.csdl|res://{0}/Repositories.EntityFramework.Model.ssdl|res://{0}/Repositories.EntityFramework.Model.msl;provider=System.Data.SqlClient;provider connection string=""" + sqlConnectionString + @"""",
            Assembly.GetCallingAssembly().FullName
        );

        return new EntityConnection(cs);
    }

2017年更新:

    public static string GetEfConnectionString(this string sqlConnectionString, Type type)
    {
        string cs =
            string.Format(
                @"metadata=res://{0}/Models.Model.csdl|res://{0}/Models.Model.ssdl|res://{0}/Models.Model.msl;provider=System.Data.SqlClient;provider connection string=""" +
                sqlConnectionString + @"""",
                type.Assembly.FullName
                );
        return cs;
    }


    // usage: don't "new" EntityConnection.  See 2012 comment.
    string connString = ConfigurationManager.ConnectionStrings["sqlConnection"].ConnectionString.GetEfConnectionString();
    using(var entities = new XyzEntities(connString))

錯誤意味着,他說:你不能在你的場景中使用默認的基於約定的映射 請改用自定義數據庫映射 Scott Guthrie有一個關於的詳細博客項目。

我有同樣的問題,但我的解決方案是從項目中刪除MODEL \\ edmx的DLL,因為它是從不同的項目復制,然后重建它。 解決了一切!

這個錯誤的另一個原因是我發生了什么:我的項目是從其他地方復制的,我重命名了項目,所以編譯后我的bin文件夾中有2個DLL。 上一個項目中的一個和一個全新的項目,根據新項目命名。 一旦我刪除了以前/舊的DLL,名稱空間歧義消失了,錯誤就消失了。

對於DB第一種方法,幸運的是有幾種解決方法非常簡單:

  1. 確保兩個上下文不共享具有相同名稱的表 - 這不是最實用的方法。
  2. 通過隔離自己的程序集中的數據庫上下文來重構解決方案。

有關更多詳細信息,請參閱此鏈接

解釋得很清楚。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM