Sunday, January 19, 2014

Entity Framework 6 + Stored Procedure = The type or namespace name 'Objects' does not exist in the namespace 'System.Data'

(this post is formatted poorly, it will be fixed later because I really need to post this one before I forget it)

On my latest project I upgraded to Entity Framework Version 6 and everything was fine until I tried to add a Stored Procedure function import.

After adding that I could no longer build the project and the error message of "The type or namespace name 'Objects' does not exist in the namespace 'System.Data' (are you missing an assembly reference?)" started showing up.

I found the solution here and the fix is to download the Entity Framework 6 Tools for Visual Studio 2012/2013.

Note:  After you install the tools, your model will still not compile.  To fix it you must either:

  • Delete and re-add the Model.edmx to your project
OR
  • Create another model and copy the Context.tt file from it over your initial model.  After you copy the .tt, on Line 5 you'll need to set the name of your original Model.edmx
Line 5: const string inputFile = @"OriginalModel.edmx";
Now, after it compiled I ran into the fun error message "System.InvalidOperationException: The value of EntityCommand.CommandText is not valid for a StoredProcedure command. The EntityCommand.CommandText value must be of the form 'ContainerName.FunctionImportName'."  At this point I was almost ready to write EF6 off as unusable, but I found a page at http://www.dotnetbits.com/entity-framework-6-t4-templates/ that gave me the updates to Context.tt that I needed.

Look for the method signature

public string ExecuteFunction(EdmFunction edmFunction, string modelNamespace, bool includeMergeOption)

Replace that method with

public string ExecuteFunction(EdmFunction edmFunction, string modelNamespace, bool includeMergeOption)
{
var parameters = _typeMapper.GetParameters(edmFunction);
var returnType = _typeMapper.GetReturnType(edmFunction);
var callParams = _code.StringBefore(", ", String.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray()));
if (includeMergeOption)
{
callParams = ", mergeOption" + callParams;
}
return string.Format(
CultureInfo.InvariantCulture,
"return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction{0}(\"{1}\"{2});",
returnType == null ? "" : "<" + _typeMapper.GetTypeName(returnType, modelNamespace) + ">",
edmFunction.FullName,
callParams);
}

7 comments:

Peter

Greatly explained! That's something reallyFreaky Guide. Thanks a bundle!

Arnold DK

Greatly explained! That's something really Kinemaster Gold

Guide. Thanks a bundle.

Lillipy

Hey, Action lover, do you want to play the most popular action game Nulls Brawl in your mobile, then try this out with unlimited money?

สล็อต เว็บ ตรง

tgaslot มิติใหม่ของการหาเงินแบบง่ายๆ คุณพร้อมแล้วหรือยัง ที่จะเข้ามาสัมผัสกับ pg slot มิติใหม่ที่โลกของออนไลน์ แล้วก็เกมออนไลน์ ถ้าหากคุณพร้อมแล้วพวกเราขอเชิญชวน

เว็บ เกม สล็อต

บริการ spt pgslot สล็อตออนไลน์สุดแจ่ม ปัจจุบันส่งตรงมาจากค่ายเกมน่าไว้ใจไม่เหมือนใครถือได้ว่าที่เดียวที่กล้าเปิดให้ผู้เล่นมือใหม่ทุกคน pg slot สามารถเข้ามาเล่นก่อนได้

ทางเข้า pg slot

full slot พวกเราได้เก็บเกมสล็อตที่ได้รับความนิยมไว้ตรงนี้แล้วมีนานาประการแบบสล็อตจากหลายค่าย pg slot เกมสล็อตภาพงามล้ำสมัยเสียงประกอบตระการตา น่าระทึกใจ ให้ท่านเพลิดเพลิน

PG SLOT

เกม UFA Wallet 777 เป็นเครื่องบินในกลุ่มของสายการบินไทยแอร์เอเชีย (Thai Airways International) PG SLOT งเป็นเครื่องบินโดยสารขนาดใหญ่ที่มีความจุสูงสุดถึง 364 ที่นั่ง มีระยะทางบินได้ถึง