gpt4 book ai didi

entity-framework - 在 Entity Framework 代码优先中使用动态连接字符串进行迁移(来自文本文件的连接字符串)

转载 作者:行者123 更新时间:2023-12-04 17:55:59 29 4
gpt4 key购买 nike

我使用 EF6 代码优先,首先,我将连接字符串放在名为“Settings.txt”的文本文件中

'Settings.txt'文件中的数据是

DataProvider: sqlserver
DataConnectionString: Data Source=.\SQLEXPRESS;Initial Catalog=MyDb;Integrated Security=True;Persist Security Info=False;Enlist=False;

我在 dbContext 类中使用的是:

public class DbDataContext : BaseDbContext
{
static DbDataContext()
{
Database.SetInitializer(new ContextInitializer());
}

public DbDataContext():base() { }

public DbDataContext(string nameOrConnectionString)
: base(nameOrConnectionString) { }

...
}

[DbConfigurationType(typeof(MyDbConfiguration))]
public abstract partial class BaseDbContext : DbContext, IDbContext
{
public BaseDbContext() : this(GetConnectionString())
{ }

public BaseDbContext(string nameOrConnectionString) : base(nameOrConnectionString)
{ }

public static string GetConnectionString()
{
if (DataSettings.DataSettings.Current.IsValid())
{
return DataSettings.DataSettings.Current.DataConnectionString;
}

throw Error.Application("A connection string could not be resolved for the parameterless constructor of the derived DbContext. Either the database is not installed, or the file 'Settings.txt' does not exist or contains invalid content.");
}
}

public class MyDbConfiguration : DbConfiguration
{
public MyDbConfiguration()
{
IEfDataProvider provider = null;

try
{
provider = (new EfDataProviderFactory(DataSettings.DataSettings.Current).LoadDataProvider()) as IEfDataProvider;
}
catch {
}

if (provider != null)
{
base.SetDefaultConnectionFactory(provider.GetConnectionFactory());
}
}
}

public partial class EfDataProviderFactory : DataProviderFactory
{
public EfDataProviderFactory()
: this(DataSettings.DataSettings.Current){ }

public EfDataProviderFactory(DataSettings.DataSettings settings)
: base(settings) { }

public override IDataProvider LoadDataProvider()
{
var providerName = Settings.DataProvider;

if (providerName.IsEmpty())
{
throw new Exception("Data Settings doesn't contain a providerName");
}

switch (providerName.ToLowerInvariant())
{
case "sqlserver":
return new SqlServerDataProvider();

case "sqlserverce":
return new SqlServerCeDataProvider();

default:
throw new Exception(string.Format("Unsupported dataprovider name: {0}", providerName));
}
}
}

public class SqlServerDataProvider : IEfDataProvider
{
public virtual IDbConnectionFactory GetConnectionFactory()
{
return new SqlConnectionFactory();
}

public bool StoredProceduresSupported
{
get { return false; }
}

public DbParameter GetParameter()
{
return new SqlParameter();
}

public string ProviderInvariantName
{
get { return "System.Data.SqlClient"; }
}
}

我在“BaseDbContext”类中使用了一个名为“GetConnectionString()”的静态函数

此函数仅用于从文本文件返回连接字符串。此行为在运行时运行良好,但在添加迁移时不起作用。

这就是问题所在:如何通过这种方式添加迁移,知道当我像这样将连接字符串直接放在函数中时

    public static string GetConnectionString()
{
return (@"Data Source=.\\SQLEXPRESS;Initial Catalog=MyDb;Integrated Security=True;Persist Security Info=False;Enlist=False;");
}

Add-Migration 命令正在运行

如何在不强制代码中的连接字符串的情况下解决这个问题?

最佳答案

我解决了这个,在设计模式下获取文件路径(文本文件)时出现问题,甚至单元测试

string filePath = Path.Combine(MapPath("~/App_Data/"), "Settings.txt");

public static string MapPath(string path)
{
path = path.Replace("~/", "").TrimStart('/').Replace('/', '\\');

var testPath = Path.Combine(baseDirectory, path);

var dir = FindSolutionRoot(baseDirectory);

if (dir != null)
{
baseDirectory = Path.Combine(dir.FullName, "MyProjectName.WebAPI");
testPath = Path.Combine(baseDirectory, path);


return testPath;
}
}

private static DirectoryInfo FindSolutionRoot(string currentDir)
{
var dir = Directory.GetParent(currentDir);
while (true)
{
if (dir == null || IsSolutionRoot(dir))
break;

dir = dir.Parent;
}

return dir;
}

private static bool IsSolutionRoot(DirectoryInfo dir)
{
return File.Exists(Path.Combine(dir.FullName, "MySolutionName.sln"));
}

这样,我们就可以得到运行时模式下的文件路径

关于entity-framework - 在 Entity Framework 代码优先中使用动态连接字符串进行迁移(来自文本文件的连接字符串),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40330314/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com