Первый возможный выпуск:
Это менее вероятно , так как другие люди предложили вам. Но, возможно, вы пропустили строку подключения в одном из ваших web.config или app.config.
Хорошей привычкой является копирование вашей строки в каждый проект. Пример. У меня есть 3 различных проекта в моем решении (Библиотека, WCF, WPF). Я скопировал следующую строку подключения в каждый проект ( Один образец для локального SQL Server и другой для Azure ):
<connectionStrings>
<add name="LocalSQLServerSample.CodeREDEntities" connectionString="metadata=res://*/CodeRED.csdl|res://*/CodeRED.ssdl|res://*/CodeRED.msl;provider=System.Data.SqlClient;provider connection string="data source=MachineName\ServerName;initial catalog=CodeRED;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
<add name="AzureSQLServerSample.CodeREDEntities" connectionString="metadata=res://*/CodeRED.csdl|res://*/CodeRED.ssdl|res://*/CodeRED.msl;provider=System.Data.SqlClient;provider connection string='data source=azureservername.database.windows.net;initial catalog="CodeRED";persist security info=True;user id=CodeRED;password=R%Chd$g*VHs28eEr;MultipleActiveResultSets=True;App=EntityFramework'" providerName="System.Data.EntityClient" />
</connectionStrings>
Второй возможный выпуск:
Вы упомянули, что используете структуру сущностей. Вы используете ObjectContext для доступа к нему? Если да, у меня есть метод ниже, чтобы вызывать его каждый раз, когда я хочу получить доступ к любой базе данных:
Из примера выше: name = "LocalSQLServerSample.CodeREDEntities"
_containerName is CodeREDEntities (То же самое для всех моих соединений).
environment - определить, к какой базе данных вы подключаетесь. Например, в приведенном выше примере подключения у меня есть LocalSQLServerSample и AzureSQLServerSample , и у меня обычно есть что-то вроде PRODUCTION , DEVELOPMENT , ИСПЫТАНИЯ ....
public static ObjectContext getObjectContext(string environment, bool isReadOnly)
{
environment = environment == null ? "" : environment.Trim();
environment = environment.Length == 0 ? "" : (environment + ".");
ObjectContext objectContext = new ObjectContext(
ConfigurationManager.ConnectionStrings[environment + _containerName].ToString());
objectContext.DefaultContainerName = _containerName;
objectContext.CommandTimeout = 0;
objectContext.ContextOptions.ProxyCreationEnabled = !isReadOnly;
return objectContext;
}
Пример использования:
Common - это общий класс, который я использую для хранения общей информации, такой как получение общего формата ошибок, используемого для Common.getInnerExceptionMessage.
Кроме того, вам не нужно всегда передавать окружение, вы можете сохранить его как константу, чтобы иметь возможность вызывать его, например (я всегда передаю его, чтобы иметь возможность смешивать соединения, когда мне нужно для определенных вызовов): Вы можете изменить соединение из любого места, изменив _selectedEnvironment , если вы не хотите передавать его везде.
public const string _ENVIRONMENT_DEVELOPMENT = "LocalSQLServerSample";
public const string _ENVIRONMENT_PRODUCTION = "AzureSQLServerSample";
public static string _selectedEnvironment = _ENVIRONMENT_PRODUCTION;
Пример получения предмета на основе идентификатора:
Примечание: Пользователь - это класс, созданный структурой сущностей из базы данных.
public UsersDataGrid GetItem(string environment, long id)
{
ObjectContext objectContext = Common.getObjectContext(environment, false);
try
{
var item = objectContext.CreateObjectSet<User>()
.Where(W => W.ID == id)
.Select(S => new UsersDataGrid()
{
Active = S.Active,
ID = S.ID,
Unique_ID = S.Unique_ID,
First_Name = S.First_Name.ToUpper(),
Last_Name = S.Last_Name.ToUpper(),
Email = S.Email,
School = S.School.Title.ToUpper(),
Gender = S.Gender.Title.ToUpper(),
TShirt_Size = S.TShirt_Size.Title.ToUpper(),
GUID = S.GUID + "",
Note = S.Note,
Machine_User = S.Machine_User,
Machine_Name = S.Machine_Name,
Created_On = S.Created_On,
Last_Updated_On = S.Updated_On
}).FirstOrDefault();
return item;
}
catch (Exception exception)
{
return new UsersDataGrid()
{
Note = ("Service Error: " +
Common.getInnerExceptionMessage(exception))
};
}
}
2-й пример: обновление пользователя:
Примечание: Common.CopyValuesFromSourceToDestinationForUpdate - это только обобщенный метод, копирующий элементы из объекта item в entityItem , вместо этого можно обычно копировать значения, например entityItem.ID = item.ID и т. д. ...
public Result Update(string environment, User item)
{
ObjectContext objectContext = WCF_Service_Library.Classes.Common.getObjectContext(environment, false);
try
{
var entityItem = objectContext.CreateObjectSet<User>()
.AsEnumerable().Where(Item => Item.ID == item.ID).ToList().FirstOrDefault();
if (entityItem == null)
return new Result("Item does NOT exist in the database!");
entityItem = Common.CopyValuesFromSourceToDestinationForUpdate(item, entityItem) as User;
objectContext.SaveChanges();
return new Result(entityItem.ID);
}
catch (Exception exception)
{
return new Result("Service Error: " + Common.getInnerExceptionMessage(exception));
}
}
Третья проблема (не похоже, но вы можете столкнуться с ней):
Если вы опубликуете свое приложение и подпишете ТОЛЬКО свой проект WPF, вы не получите ошибку во время публикации, но вы не сможете подключиться к базе данных. Вы должны подписать все свои проекты в вашем решении.
Надеюсь, это поможет вам с вашей проблемой