Jah*_*han 6 entity-framework entity-framework-core asp.net-core-2.0
使用时如何访问AddOrUpdate()
方法ASP.NET Core 2
?
有AddOrUpdate()
在EntityFramework 6
在System.Data.Entity.Migrations
命名空间。但是当我想在 中使用这种方法时ASP.NET Core 2
,我找不到它。
小智 0
这可能就是你想要的
public static class DbSetExtension
{
/// <exception cref="ArgumentNullException"></exception>
public static TEntity FindEntity<TEntity>(this DbSet<TEntity> dbSet, TEntity entity, bool noTracking = false) where TEntity : class
{
if (entity == null)
{
throw new ArgumentNullException(nameof(entity));
}
var dbContext = dbSet.GetService<ICurrentDbContext>().Context;
var entityEntry = dbContext.Entry(entity);
var entityType = entityEntry.Metadata;
var primaryKey = entityType.FindPrimaryKey();
if (primaryKey == null)
{
return (noTracking ? dbSet.AsNoTracking() : dbSet).FirstOrDefault(item => item.Equals(entity));
}
var ids = primaryKey.Properties.Select(item => item.PropertyInfo.GetValue(entity)).ToArray();
var result = dbSet.Find(ids);
if (noTracking && result != null)
{
dbContext.Entry(result).State = EntityState.Detached;
}
return result;
}
/// <exception cref="ArgumentNullException"></exception>
public static async ValueTask<TEntity> FindEntityAsync<TEntity>(this DbSet<TEntity> dbSet, TEntity entity, bool noTracking = false)
where TEntity : class
{
if (entity == null)
{
throw new ArgumentNullException(nameof(entity));
}
var dbContext = dbSet.GetService<ICurrentDbContext>().Context;
var entityEntry = dbContext.Entry(entity);
var entityType = entityEntry.Metadata;
var primaryKey = entityType.FindPrimaryKey();
if (primaryKey == null)
{
return await (noTracking ? dbSet.AsNoTracking() : dbSet).FirstOrDefaultAsync(item => item.Equals(entity));
}
var ids = primaryKey.Properties.Select(item => item.PropertyInfo.GetValue(entity)).ToArray();
var result = await dbSet.FindAsync(ids);
if (noTracking && result != null)
{
dbContext.Entry(result).State = EntityState.Detached;
}
return result;
}
/// <exception cref="ArgumentNullException"></exception>
public static EntityEntry<TEntity> Update<TEntity>(this DbSet<TEntity> dbSet, TEntity entity, bool? includeOrExclude = null,
params string[] propertyNames) where TEntity : class
{
if (entity == null)
{
throw new ArgumentNullException(nameof(entity));
}
var entityEntry = dbSet.Update(entity);
if (includeOrExclude != null)
{
foreach (var property in entityEntry.Properties)
{
if (includeOrExclude.Value ^ propertyNames?.Contains(property.Metadata.PropertyInfo.Name) == true)
{
property.IsModified = false;
}
}
}
return entityEntry;
}
/// <exception cref="ArgumentNullException"></exception>
public static EntityEntry<TEntity> AddOrUpdate<TEntity>(this DbSet<TEntity> dbSet, TEntity entity, bool? includeOrExclude = null,
params string[] propertyNames) where TEntity : class
{
if (dbSet.FindEntity(entity, true) == null)
{
return dbSet.Add(entity);
}
return dbSet.Update(entity, includeOrExclude, propertyNames);
}
/// <exception cref="ArgumentNullException"></exception>
public static async ValueTask<EntityEntry<TEntity>> AddOrUpdateAsync<TEntity>(this DbSet<TEntity> dbSet, TEntity entity, bool? includeOrExclude = null,
params string[] propertyNames) where TEntity : class
{
if (await dbSet.FindEntityAsync(entity, true) == null)
{
return await dbSet.AddAsync(entity);
}
return dbSet.Update(entity, includeOrExclude, propertyNames);
}
}
Run Code Online (Sandbox Code Playgroud)
为了简洁起见,我省略了评论。
像这样使用
var people = new People {
Id=1,
Name="Tom",
ChangeTime=DateTimeOffset.Now
AddTime=DateTimeOffset.Now,
};
await dbContext.AddOrUpdateAsync(people, false, nameof(people.AddTime));
await dbContext.SaveChangesAsync();
Run Code Online (Sandbox Code Playgroud)
或者
await dbContext.AddOrUpdateAsync(people, true, nameof(people.Name), nameof(people.ChangeTime));
await dbContext.SaveChangesAsync();
Run Code Online (Sandbox Code Playgroud)
您还可以使用它的同步方法。
我在“Microsoft.EntityFrameworkCore 2.1.1”和“Microsoft.EntityFrameworkCore 3.1.7”测试正常。
您可能需要更多:在 add 期间保存显式值。
如果实体使用自动生成的键值。另请参阅:保存单个实体。
如有遗漏,请告知。谢谢。
归档时间: |
|
查看次数: |
4488 次 |
最近记录: |