Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用WCF数据服务在DbContext上直接引用方法?_C#_Wcf Data Services_Entity Framework 5 - Fatal编程技术网

C# 使用WCF数据服务在DbContext上直接引用方法?

C# 使用WCF数据服务在DbContext上直接引用方法?,c#,wcf-data-services,entity-framework-5,C#,Wcf Data Services,Entity Framework 5,下午好,各位堆垛工(或溢流器,随便你们喜欢),这更像是一个清洁和便利的问题,但我无法想象我是唯一一个对此感到好奇的人,所以我们开始吧 我有一个基本的支持OData的WCF数据服务类,它使用我的实体框架数据上下文 [JsonpSupportBehavior] 公共类ControlBindingService:DataService { 公共静态void InitializeService(DataServiceConfiguration配置) { config.DataServiceBehavio

下午好,各位堆垛工(或溢流器,随便你们喜欢),这更像是一个清洁和便利的问题,但我无法想象我是唯一一个对此感到好奇的人,所以我们开始吧

我有一个基本的支持OData的WCF数据服务类,它使用我的实体框架数据上下文

[JsonpSupportBehavior]
公共类ControlBindingService:DataService
{
公共静态void InitializeService(DataServiceConfiguration配置)
{
config.DataServiceBehavior.MaxProtocolVersion=DataServiceProtocolVersion.V3;
config.DataServiceBehavior.AcceptCountRequests=true;
config.SetEntitySetAccessRule(“*”,EntitySetRights.All);
config.SetServiceOperationAccessRule(“*”,ServiceOperationRights.All);
}
受保护的重写MyDataContext CreateDataSource()
{
if(HttpContext.Current==null)
抛出新的InvalidOperationException(“WCF数据服务实现必须托管在IIS中”);
字符串用户名;
if(HttpContext.Current.User.Identity.IsAuthenticated)
username=HttpContext.Current.User.Identity.Name;
其他的
{
//请求没有用户标识,请尝试在中查找用户名
//将401返回给调用方之前的请求头。
if(!String.IsNullOrEmpty(HttpContext.Current.Request.Headers[“UserName”]))
{
username=HttpContext.Current.Request.Headers[“username”];
//回顾:我们应该在将用户传递到datacontext之前验证它。
}
其他的
抛出新的DataServiceException(401,“客户端未传递所需的身份验证信息”);
}
返回MyDataContext.GetInstance(用户名);
}
[WebGet]
公共列表GetResourceKPI(
int resourceId、string jsonStart、string jsoned、int scenarioId)
{
DateTime start=jsonStart.DeserializeJson();
DateTime end=jsoned.DeserializeJson();
如果(场景ID<1)
{
scenarioId=CurrentDataSource.GetScenarios()
.Single(s=>s.IsProduction).ScenarioID;
}
return CurrentDataSource.GetDailyResourceKPI(
场景ID、开始、结束、资源ID);
}
}
数据上下文只是一个标准(代码优先)
DbContext
实现,其属性公开实体集等

然而,我们也有方法公开一些表,我们希望对这些表实施一些约束。具体地说(参见下面的代码),我们希望知道调用方希望将数据用于什么目的,以便只返回适当的结果。例如,如果调用方希望从employees表中获取行,那么他们可能希望获取所有行,或者仅获取他们具有更新权限的行

[可序列化]
公共部分类MyDataContext:DbContext
{
静态MyDataContext()
{
Database.SetInitializer(null);
}
公共MyDataContext()
:base(“name=MyDBString”)
{ }
//标准表属性。。。
公共数据库集用户
{
获取{返回此.Set();}
}
公共数据库集用户设置
{
获取{返回此.Set();}
}
公共数据库集设置定义
{
获取{返回此.Set();}
}       
//限制表方法。。。
公共数据库集GetClient(
DatabasePermissions perms=数据库权限。选择)
{
//getPermissibleSet是帮助器类中的一个方法,它执行某些操作
//查询并生成过滤后的数据库集。
返回getPermissibleSet(perms);
}
公共数据库集GetEmployees(
DatabasePermissions perms=数据库权限。选择)
{
//getPermissibleSet是帮助器类中的一个方法,它执行某些操作
//查询并生成过滤后的数据库集。
返回getPermissibleSet(perms);
}       
}
现在来谈谈问题的根源。。。我想避免的是为数据上下文中的每个“受限表方法”编写一个
[WebGet]
。原因其实只是冗余——
[WebGet]
方法最终将直接传递到数据上下文

总之,我想说,我基本上希望做的是标记我的数据上下文类中的方法,WCF将以与我的DbSet属性相同的方式公开这些方法。有人要吗


谢谢!这是一个有趣的问题。我正在尝试做类似的事情。这有点像扔飞镖,但你试过这样的东西吗?您可能应该将泛型分开,这样就不会为每种类型创建唯一的上下文,但似乎您应该能够通过泛型消除重复的代码

[Serializable]
public partial class MyDataContext<T> : DbContext where T : class
{
    static MyDataContext()
    {
        Database.SetInitializer<MyDataContext>(null);
    }

    public MyDataContext()
        : base("name=MyDBString")
    { }

    // Standard table properties...

    public DbSet<T> SettingDefinitions
    {
        get { return this.Set<T>(); }
    }

    // Restricted table methods...

    public DbSet<T> GetClients(
        DatabasePermissions perms = DatabasePermissions.Select)
    {
        // getPermissibleSet is a method in a helper class that does some 
        // magical querying and produces a filtered DbSet.
        return getPermissibleSet<T>(perms);
    }
}
[可序列化]
公共部分类MyDataContext:DbContext,其中T:class
{
静态MyDataContext()
{
Database.SetInitializer(null);
}
公共MyDataContext()
:base(“name=MyDBString”)
{ }
//标准表属性。。。
公共数据库集设置定义
{
获取{返回此.Set();}
}
//限制表方法。。。
公共数据库集GetClient(
DatabasePermissions perms=数据库权限。选择)
{
//getPermissibleSet是帮助器类中的一个方法,它执行某些操作
//查询并生成过滤后的数据库集。
返回getPermissibleSet(perms);
}
}