这是我的问题:我在C#中使用ODP.NET dll的程序:oci.dll,ociw32.dll,Oracle.DataAccess.dll,orannzsbb11.dll,oraocci11.dll,oraociicus11.dll,OraOps11w.dll.
我有2台电脑.首先安装完整的ODAC包,然后安装第二个包.但我在exe目录中都需要dll,所以ODAC不是问题(我认为).这些计算机之间的区别是TNSNAMES文件的路径.第一个:C:\ app\OraHome_1\Network\admin\Second:C:\ Oracle\product\11.2.0\client_1 \network\admin
并在第一个CPU程序工作正常.但是在具有相同连接字符串的第二个上,无法打开连接(ORA-12154).使用SQL Plus,我可以在两台计算机上连接.
那么,我怎样才能展示我的程序通往TNSNAMES的正确途径?
我有点困惑。直到今天,我认为每个表(由 EF 使用)都必须在DbContext类中指定。但看起来我只需要一个!真的吗?
让我解释一下,这是我的 DbContext:
public class MyDbContext : DbContext
{
public MyDbContext()
: base("name=MyDbContext")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Database.SetInitializer<MyDbContext>(null);
base.OnModelCreating(modelBuilder);
}
public DbSet<Table1> Table1 { get; set; }
public DbSet<Table2> Table2 { get; set; }
public DbSet<Table3> Table3 { get; set; }
public DbSet<Table4> Table4 { get; set; }
public DbSet<Table5> Table5 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是两个示例表,连接 1:many
[Table("Table1")]
public class Table1
{
[Key]
[Column("Table1Id", TypeName = "uniqueidentifier")] …Run Code Online (Sandbox Code Playgroud) 我有两种方法:
Foo(int a, bool useDb)
Foo(int a, bool useDb, DbContext dbContext)
Run Code Online (Sandbox Code Playgroud)
有没有办法将它作为一种方法,用这些规则?
if useDb为true dbContext是强制性的,
如果useDb为false dbContext则是可选的
编辑:
只是一个编辑来澄清,我正在尝试做什么:在业务/服务层,我有ItemService方法GetItemStatus.它连接到数据库,获取数据并计算状态.
没什么特别的.它创建了一个DbContext(EF6.0),完成并处理它.标准.但是如果我想将GetItemStatus用作不同事务的一部分呢?哈!?我需要在内部传递DbContext并且不要显然处理它.我创建了这样的东西:
public ItemStatus GetItemStatus(int itemId, OfficeContext fni = null)
{
bool shouldBeDisposed = (fni == null) ? true : false;
if (shouldBeDisposed) fni = ContextFactory.CreateOfficeContext();
try
{
Do the stuff...
}
finally
{
if (shouldBeDisposed) fni?.Dispose();
}
return ...
}
Run Code Online (Sandbox Code Playgroud)
但现在我有点害怕,因为如果有人打电话:
GetItemStatus(123456);
......他忘了添加DbContext.我不确定他是否真的意味着它.Altoguh它应该不那么糟糕.他将创造新的并处理它.
但我正在考虑最好的方法,以确保开发人员不会犯错误."万无一失"的方式.