注意:我是C#.Net MVC和Entity Framework的新手,我正在开发一个现有项目。在这个项目中,我有以下课程:
public class MyDbContext : DbContext, IMyDbContext
{
public MyDbContext() : base("name=SQLAzureConnection")
{
}
... // Some IDbSet properties
... // Some methods
}
和以下界面:
public interface IMyDbContext
{
... // Some properties
... // Some methods
void Dispose();
}
在我使用的一种方法中:
using(IMyDbContext usingDb = MvcApplication.dbContext())
{
// Some query with usingDb
}
(MvcApplication.dbContext()
是委托(Func),在我的MvcApplication`中实例化如此:
public class MvcApplication : System.Web.HttpApplication
{
// Delegate Func to create a new IMyDbContext instance
public static Func<IMyDbContext> dbContext;
public static MyDbContext dbContextInit()
{
return new MyDbContext();
}
... // Some other fields
protected void Application_Start()
{
...
dbContext = dbContextInit();
}
}
我有这个委托的原因是短期DbContext并且能够在我的UnitTests中使用它。)
由于使用中的对象应为Disposable
,因此我将界面修改为以下内容:
public interface IMyDbContext : IDisposable
{
... // Some properties
... // Some methods
void Dispose();
}
一切正常,除了我收到以下警告:
'MyNamespace.Model.IMyDbContext.Dispose()' hides inherited member
'System.IDisposable.Dispose()'. Use the new keyword if hiding was intended.
这是否意味着我应该使用:new void Dispose();
而不是void Dispose()
?我继承IDisposable
的唯一原因是我可以在using
中使用它。所以我想new
- 关键字所以使用DbContext.Dispose()
是正确的处理方法吗?或者我做错了什么?
我也读过我可以使用try-finally
代替using
,因此我自己在usingDb.Dispose()
使用finally-case
。不过,我更喜欢自己继承IDisposable
而不是那个选项。
答案 0 :(得分:2)
你可以在你的界面中删除你的dispose
,因为你已经从IDisposable
获得它,所以只需将你的界面更改为:
public interface IMyDbContext : IDisposable
{
... // Some properties
}
这是因为您已使IMyDbContext
一次性使用IDisposable
,因此您无需再次明确添加。编译通过让两个Dispose
没有明确地告诉用户原因而警告您正在做一些奇怪的事情。
摘要:只需将其删除,您就是金色的!
答案 1 :(得分:0)
如果IDisposable.Dispose
和IMyDbContext.Dispose
表示相同的内容,请执行以下操作:
public interface IMyDbContext : IDisposable
{
... // Some properties
// You get Dispose() from `IDisposable`
}
如果IDisposable.Dispose
和IMyDbContext.Dispose
表示不同的东西(需要不同的实现),请使用显式接口实现
public class MyDbContext : DbContext, IMyDbContext
{
public MyDbContext() : base("name=SQLAzureConnection")
{
}
IMyDbContext.Dispose() // Implement it via explicit implementation
{
}
}