我们正在创建一个使用Entity Framework的应用程序来处理特定于单个用户的数据。数据库支持无限用户,因此我们需要按UserId进行过滤。 SQL Server后端具有所有表的公共列(INT UserId)。对于数据库的每个查询,我们必须传递和评估一个UserId参数,例如LINQ等。有没有一种好的方法可以删除这些代码,以便所有查询自动传递一个更高级别的UserId集?例如,如果我想从UserId的数据库中获取GetFoo(),我可以让应用程序调用context.GetFoo()而不必将UserId作为参数传递?也许在创建上下文时,我们可以在该级别传递UserId吗?
答案 0 :(得分:0)
您可以使用以下
在你的DbContext中,你可以定义一个像这样的静态属性android {
compileSdkVersion 22
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "com.yourappname"
minSdkVersion 22
targetSdkVersion 22
versionCode 1
versionName "1"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-project.txt'), 'proguard-rules.pro'
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
compile project(':nameOfTheLibrary')
}
然后定义以下界面
public static int UserId;
然后您将通过上述public interface IUser
{
int UserId {get; set;}
}
界面装饰UserId
的所有实体
并在IUser
内,您可以写下以下内容:
DbContext
你可以使用上面的代码如下
public static IQueryable<T> WhereUser<T>(this DbSet<T> query, Expression<Func<T, bool>> predicate) where T : class,IUser
{
return query.Where(predicate).Where(t => t.UserId == UserId);
}
希望这会对你有所帮助
答案 1 :(得分:0)
您可以使用此库:https://github.com/jcachat/EntityFramework.DynamicFilters
只需在需要按用户ID过滤的所有实体上实现具有userId的界面。
public interface IUserEntity
{
int UserId {get; set;}
}
将userId传递给DbContext,然后传入OnModelCreating:
modelBuilder.Filter("UserId", (IUserEntity u) => u.UserId, _userId);