Entity framework 使用EF6从配置文件创建WCF连接字符串
我有一个WCF服务,它有一个内部连接字符串“Model\u DB\u Custom”,可以通过Entity Framework 6连接到我的数据库 DBContext构造函数是:Entity framework 使用EF6从配置文件创建WCF连接字符串,entity-framework,wcf,configuration-files,Entity Framework,Wcf,Configuration Files,我有一个WCF服务,它有一个内部连接字符串“Model\u DB\u Custom”,可以通过Entity Framework 6连接到我的数据库 DBContext构造函数是: public partial class Model_DB : DbContext { /// <summary> /// Create a dbcontext from default connectionString in app.config to Sql Se
public partial class Model_DB : DbContext
{
/// <summary>
/// Create a dbcontext from default connectionString in app.config to Sql Server
/// </summary>
public Model_DB() : base(
((ConnectionStringsSection)
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
.GetSection("connectionStrings"))
.ConnectionStrings["Model_DB_Custom"]
.ConnectionString)
{
//This constructor works if connectionstring is changed at runtime...
}
...
}
公共部分类模型\u DB:DbContext
{
///
///从app.config中的默认connectionString到Sql Server创建dbcontext
///
公共模型_DB():基本(
((连接字符串部分)
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
.GetSection(“连接字符串”))
.ConnectionString[“模型数据库自定义”]
.连接字符串)
{
//如果在运行时更改了connectionstring,则此构造函数可以工作。。。
}
...
}
当windows服务应用程序使用此WCF服务时,ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
返回正确的WCF服务器配置文件(表示“C:\Program Files\WCfService\WCfService.exe.config”
)
当WPF应用程序使用此WCF服务时,ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
返回其配置文件(表示“C:\Program Files\WPFApp\WPFApp.exe.config”
)
我有一些想法:
- 许可问题?Windows服务正在系统帐户和下运行 管理员管理下的WPF应用程序
- 这2个客户端的app.config文件不正确
谢谢你的帮助 托马斯,你说得对!谢谢你这个好主意 好的,最后我的问题与app.config没有任何关系 我没有正确调用我的WCF服务 为了避免代理的生成/使用,我在我的WCF服务中使用了ChannelFactory(),因为我同时管理服务器和客户机,而这是一个简单的配置,很糟糕 现在,此WCF服务通过以下代码通过MVVM Light/SimpleIOC实现: ViewModelLocator.cs:
public class ViewModelLocator
{
static ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
//Define data access (wcf service) for design mode
if (ViewModelBase.IsInDesignModeStatic)
{
SimpleIoc.Default.Register<IService, Design.DesignDataService>();
}
...
}
公共类ViewModelLocator
{
静态ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(()=>SimpleIoc.Default);
//为设计模式定义数据访问(wcf服务)
if(ViewModelBase.IsIndesignatic)
{
SimpleIoc.Default.Register();
}
...
}
WcfServer类:
public class WcfServer : IDisposable
{
...
//Wcf connection
private ChannelFactory<IService> _wcfFactory = null;
/// <summary>
/// Gets the DataService proxy from MVVMLight SimpleIOC instance.
/// </summary>
public IService DataService
{
get
{
return SimpleIoc.Default.GetInstance<IService>();
}
}
public WcfServer(string urlServer)
{
UrlServer = urlServer;
}
/// <summary>
/// Connect to wcf service
/// </summary>
public bool Connect()
{
try
{
...
EndpointAddress endpointAddress = new EndpointAddress(new Uri(UrlServer));
if (_wcfFactory == null)
{
_wcfFactory = new ChannelFactory<IService>(WCFSharedConfiguration.ConfigureBindingWithSimplehttps(), endpointAddress);
//Open ChannelFactory
_wcfFactory.Open();
//Define Faulted handler
_wcfFactory.Faulted += FactoryFaulted;
}
else
//Log + return
if (!ViewModelBase.IsInDesignModeStatic)
{
//If we are not in Design (means blend or VS IDE)
SimpleIoc.Default.Register<IService>(() => _wcfFactory.CreateChannel(), true);
}
}
catch (Exception ex)
{
//Log
throw;
}
return true;
}
public bool Disconnect()
{
SimpleIoc.Default.Unregister<IService>();
}
}
公共类WcfServer:IDisposable
{
...
//Wcf连接
私有通道工厂_wcfFactory=null;
///
///从MVVMLight SimpleIOC实例获取数据服务代理。
///
公共设备数据服务
{
得到
{
返回SimpleIoc.Default.GetInstance();
}
}
公共WcfServer(字符串urlServer)
{
UrlServer=UrlServer;
}
///
///连接到wcf服务
///
公共布尔连接()
{
尝试
{
...
EndpointAddress EndpointAddress=新的EndpointAddress(新Uri(UrlServer));
if(_wcfFactory==null)
{
_wcfFactory=newchannelfactory(WCFSharedConfiguration.configureBindingWithImpleHttps(),endpointAddress);
//明渠工厂
_wcfFactory.Open();
//定义故障处理程序
_wcfFactory.Faulted+=FactoryFaulted;
}
其他的
//日志+返回
如果(!ViewModelBase.isindesignatic)
{
//如果我们不在设计中(意味着混合或VS IDE)
SimpleIoc.Default.Register(()=>wcfFactory.CreateChannel(),true);
}
}
捕获(例外情况除外)
{
//日志
投掷;
}
返回true;
}
公共bool Disconnect()
{
SimpleIoc.Default.Unregister();
}
}
可能会有帮助!只需使用:base(“name=Model\u DB\u Custom”)嗨,Eric,如果在WCF服务运行时修改此连接字符串,此解决方案似乎不起作用…事实上,base(“name=Model\u DB\u Custom”)无法识别。我尝试了,但我可以看到数据库连接是:“数据源=。\SQLEXPRESS;集成安全性=SSPI;AttachDBFilename=| DataDirectory | aspnetdb.mdf;用户实例=true"。我想这是一个默认连接字符串…我从未实现过。根据您的评论,看起来您并不是在远程调用WCF服务,而是直接引用服务实现并在进程中运行。我们是否遗漏了什么?@thomasr,感谢您有趣的评论!我添加了一个在每个客户端中引用wcf服务库。我不使用代理,因为它与我的windows服务一起工作。你是说在使用wcf服务之前使用“svcutil”吗?