Alan Wayne
Alan Wayne

Reputation: 5384

How to make WCF set a connection string for use with EntityFramework

Using EntityFramework, I have an auto-generated file with:

namespace Chaos.Data    
{
public partial class ChaosModel : OpenAccessContext, IChaosModelUnitOfWork
{
    private static string connectionStringName = @"ChaosLibraryConnection";

    private static BackendConfiguration backend = GetBackendConfiguration();

    private static MetadataSource metadataSource = XmlMetadataSource.FromAssemblyResource("EntitiesModel.rlinq");

    public ChaosModel()
        :base(connectionStringName, backend, metadataSource)
    { }

    public ChaosModel(string connection)
        :base(connection, backend, metadataSource)
    { }

     ......................

In the WCF Service, I am using:

namespace Chaos.DataService
{
[ServiceContract]
public class ChaosService 
{
    [OperationContract]
    public IEnumerable<Encountertime> GetEncounterTimes(DateTime? encountertime)
    {
        if (encountertime == null) return null;

        using (var context = new ChaosModel())
        {
            var query = from et in context.Encountertimes
                        where et.Tencounter.Date == ((DateTime)encountertime).Date
                        select et;

           var result = context.CreateDetachedCopy(query.ToList());
            return result;
        }
    }
 .............................

How can I make the WCF service on startup execute a method (once) that will return a new connection string so that I can change the calls to ChaosModel() to:

using (var context = new ChaosModel(connectionString))

(I am looking for a way to add a static constructor within the WCF service--or something better?).

(The method will determine the network I am on and construct an appropriate connection string to the network server.)

Note: I can make no changes to the auto-generated Entity file.

Upvotes: 0

Views: 520

Answers (1)

codeworx
codeworx

Reputation: 2745

Use static constructor.

[ServiceContract]
public class ChaosService 
{
    private static string connectionString;

    static ChaosService(){
        connectionString = your logic...
    }

    [OperationContract]
    public IEnumerable<Encountertime> GetEncounterTimes(DateTime? encountertime)
    {
        using (var context = new ChaosModel(connectionString))
        {
           ...
        }
    }
}

or eventually a singleton pattern:

public class ConnectionInfo
{
    public string ConnectionString { get; private set; }

    private ConnectionInfo()
    {
        var connectionstring = string.Empty;
        //some logic

        this.ConnectionString = connectionstring;
    }

    private static ConnectionInfo current;

    public static ConnectionInfo Current {
        get {
            if (current != null)
                current = new ConnectionInfo();

            return current;
        }
    }
}        

[OperationContract]
public IEnumerable<Encountertime> GetEncounterTimes(DateTime? encountertime)
{
    using (var context = new ChaosModel(ConnectionInfo.Current.ConnectionString))
    {
       ...
    }
}

Upvotes: 2

Related Questions