Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 使用EF6从配置文件创建WCF连接字符串_Entity Framework_Wcf_Configuration Files - Fatal编程技术网

Entity framework 使用EF6从配置文件创建WCF连接字符串

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

我有一个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 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”吗?