2009-07-23 44 views
1

我在使用實體框架和C#時出現錯誤。使用ObjectContext.AddObject與實體框架時出現錯誤

我想保存任何通用實體類似一行代碼如下:

objectContextInstance.AddObject(objectToSave.GetType().ToString(), objectToSave) 

我收到的錯誤消息是:

所提供的EntitySet的名稱必須是 合格由EntityContainer名稱 (如 )必須爲ObjectContext設置'EntityContainerName.EntitySetName', 或DefaultContainerName屬性 。

我不明白這個錯誤,因爲我檢查了實體數據模型並驗證了DefaultContainerName已被設置。

任何人都可以提供有關如何解決這個問題的任何建議嗎?

回答

4

試試這個:

objectContextInstance.AddObject(objectToSave.GetType().Name, objectToSave) 

Type.ToString()返回名稱空間限定的名稱,這可能是不是也該EntitySet的名稱。

另外,當然,這隻有在實體類型名稱和實體集名稱相同時纔有效。如果不能保證這一點,則可以使用反射來檢查對象上下文的公共方法,該簽名以AddTo開頭,並採用與objectToSave相同類型的單個參數。 (這些方法由EDMX代碼生成器生成,並將實體類型與實體集相匹配。)

當然,這會有點慢 - 但如果您的數據庫不是插入數據庫,沒關係。

+0

工作,謝謝!我不明白的是,我之前在WPF應用程序中使用過我的策略,並通過了我的單元測試。但是,現在我使用它與ASP.NET MVC,它不起作用。無論如何,感謝您的解決方案。 – YeahStu 2009-07-23 22:53:48

0

我發現了一個擴展方法,該方法獲取指定實體的EntitySetBase。這是我用來派生我的EntitySetBase。我正在使用自我跟蹤實體。所以,我已經把這個功能到.TT文件擴展部分:

public static EntitySetBase GetEntitySet(this ObjectContext context, Type entityType) 
    { 
    if (context == null) 
    { 
    throw new ArgumentNullException("context"); 
    } 

    if (entityType == null) 
    { 
    throw new ArgumentNullException("entityType"); 
    } 

    EntityContainer container = context.MetadataWorkspace.GetEntityContainer(context.DefaultContainerName, DataSpace.CSpace); 

    if (container == null) 
    { 
    return null; 
    } 

    EntitySetBase entitySet = container.BaseEntitySets.Where(item => item.ElementType.Name.Equals(entityType.Name)) 
       .FirstOrDefault(); 

    return entitySet; 
    } 

客戶端代碼是這樣的:

串entitySetName = Context.GetEntitySet(user.GetType())名稱;

希望這會有所幫助。