WCFService 的 DBContext 到 MVC 应用程序?
WCFService's DBContext to MVC App?
我在 'WCFSolution' 解决方案下创建了一个 'WCFService' 应用程序,并使用 Entity Framework 从 'WCFService' 应用程序中的数据库 'DemoDB' 生成了 DBContext。并且还在 WCFService 中创建了一些 CRUD 方法(效果很好)。
然后我在相同的解决方案 ('WCFSolution') 下创建了一个空的 'WCFMVCApp' MVC 应用程序,并且还添加了对该应用程序的服务引用。现在我需要使用在该 WCFService 中生成的 DBContext 创建一个控制器 ('HomeController'),以便我可以在创建控制器时基于 WCF 模型生成视图。
我可以在 WCFMVCApp 中创建一个新的 EF,但这会破坏 WCF 的目的。任何方式来做到这一点。或者有可能吗?任何帮助,将不胜感激。谢谢。
如果您使用的是 WCF 服务,则在您的 MVCProject 中没有要处理的 DbContext,您不应添加对 WCF 服务的引用。你有一些选择。
解决方案 1:使用客户端
在您的 MVC 项目中创建一个数据服务客户端。您的服务应该是 运行 并且您需要安装数据服务工具。然后您可以添加一个服务引用并为您生成一些代理 classes。
WCF Data Services 5.6.0 RTM Tools Installer
解决方案 2:添加 DbContext dll
您可以让您的 DbContext 存在于您在服务和 MVC 项目中引用的单独 class 库中。
在这两种情况下,您都使用 DataServiceContext 来执行 CRUD 操作。对于第二个,您可能必须为 ResolveType
添加一个实现。要了解如何执行此操作,这是自动生成的 DataServiceContext 解析类型的方式:
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.OData.Client.Design.T4", "2.1.0")]
public Container(global::System.Uri serviceRoot) :
base(serviceRoot, global::Microsoft.OData.Client.ODataProtocolVersion.V4)
{
....
this.ResolveType = new global::System.Func<string, global::System.Type>(this.ResolveTypeFromName);
....
}
/// <summary>
/// Since the namespace configured for this service reference
/// in Visual Studio is different from the one indicated in the
/// server schema, use type-mappers to map between the two.
/// </summary>
protected string ResolveNameFromType(global::System.Type clientType)
{
global::Microsoft.OData.Client.OriginalNameAttribute originalNameAttribute = (global::Microsoft.OData.Client.OriginalNameAttribute)global::System.Linq.Enumerable.SingleOrDefault(global::Microsoft.OData.Client.Utility.GetCustomAttributes(clientType, typeof(global::Microsoft.OData.Client.OriginalNameAttribute), true));
if (clientType.Namespace.Equals("ODataSamples.CustomFormatService", global::System.StringComparison.Ordinal))
{
if (originalNameAttribute != null)
{
return string.Concat("ODataSamples.CustomFormatService.", originalNameAttribute.OriginalName);
}
return string.Concat("ODataSamples.CustomFormatService.", clientType.Name);
}
return null;
}
我在 'WCFSolution' 解决方案下创建了一个 'WCFService' 应用程序,并使用 Entity Framework 从 'WCFService' 应用程序中的数据库 'DemoDB' 生成了 DBContext。并且还在 WCFService 中创建了一些 CRUD 方法(效果很好)。
然后我在相同的解决方案 ('WCFSolution') 下创建了一个空的 'WCFMVCApp' MVC 应用程序,并且还添加了对该应用程序的服务引用。现在我需要使用在该 WCFService 中生成的 DBContext 创建一个控制器 ('HomeController'),以便我可以在创建控制器时基于 WCF 模型生成视图。
我可以在 WCFMVCApp 中创建一个新的 EF,但这会破坏 WCF 的目的。任何方式来做到这一点。或者有可能吗?任何帮助,将不胜感激。谢谢。
如果您使用的是 WCF 服务,则在您的 MVCProject 中没有要处理的 DbContext,您不应添加对 WCF 服务的引用。你有一些选择。
解决方案 1:使用客户端
在您的 MVC 项目中创建一个数据服务客户端。您的服务应该是 运行 并且您需要安装数据服务工具。然后您可以添加一个服务引用并为您生成一些代理 classes。
WCF Data Services 5.6.0 RTM Tools Installer
解决方案 2:添加 DbContext dll
您可以让您的 DbContext 存在于您在服务和 MVC 项目中引用的单独 class 库中。
在这两种情况下,您都使用 DataServiceContext 来执行 CRUD 操作。对于第二个,您可能必须为 ResolveType
添加一个实现。要了解如何执行此操作,这是自动生成的 DataServiceContext 解析类型的方式:
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.OData.Client.Design.T4", "2.1.0")]
public Container(global::System.Uri serviceRoot) :
base(serviceRoot, global::Microsoft.OData.Client.ODataProtocolVersion.V4)
{
....
this.ResolveType = new global::System.Func<string, global::System.Type>(this.ResolveTypeFromName);
....
}
/// <summary>
/// Since the namespace configured for this service reference
/// in Visual Studio is different from the one indicated in the
/// server schema, use type-mappers to map between the two.
/// </summary>
protected string ResolveNameFromType(global::System.Type clientType)
{
global::Microsoft.OData.Client.OriginalNameAttribute originalNameAttribute = (global::Microsoft.OData.Client.OriginalNameAttribute)global::System.Linq.Enumerable.SingleOrDefault(global::Microsoft.OData.Client.Utility.GetCustomAttributes(clientType, typeof(global::Microsoft.OData.Client.OriginalNameAttribute), true));
if (clientType.Namespace.Equals("ODataSamples.CustomFormatService", global::System.StringComparison.Ordinal))
{
if (originalNameAttribute != null)
{
return string.Concat("ODataSamples.CustomFormatService.", originalNameAttribute.OriginalName);
}
return string.Concat("ODataSamples.CustomFormatService.", clientType.Name);
}
return null;
}