Merge pull request #13085 from michaelnebel/csharp/dbsetsummaries

C#: Entity framework. Convert DbSet summaries to MaD models.
This commit is contained in:
Michael Nebel
2023-05-24 10:45:40 +02:00
committed by GitHub
8 changed files with 83 additions and 61 deletions

View File

@@ -1,4 +1,22 @@
extensions:
- addsTo:
pack: codeql/csharp-all
extensible: summaryModel
data:
- ["Microsoft.EntityFrameworkCore", "DbSet<>", False, "Add", "(TEntity)", "", "Argument[0]", "Argument[this].Element", "value", "manual"]
- ["Microsoft.EntityFrameworkCore", "DbSet<>", False, "AddAsync", "(TEntity,System.Threading.CancellationToken)", "", "Argument[0]", "Argument[this].Element", "value", "manual"]
- ["Microsoft.EntityFrameworkCore", "DbSet<>", False, "AddRange", "(System.Collections.Generic.IEnumerable<TEntity>)", "", "Argument[0].WithElement", "Argument[this]", "value", "manual"]
- ["Microsoft.EntityFrameworkCore", "DbSet<>", False, "AddRange", "(TEntity[])", "", "Argument[0].WithElement", "Argument[this]", "value", "manual"]
- ["Microsoft.EntityFrameworkCore", "DbSet<>", False, "AddRangeAsync", "(System.Collections.Generic.IEnumerable<TEntity>,System.Threading.CancellationToken)", "", "Argument[0].WithElement", "Argument[this]", "value", "manual"]
- ["Microsoft.EntityFrameworkCore", "DbSet<>", False, "AddRangeAsync", "(TEntity[])", "", "Argument[0].WithElement", "Argument[this]", "value", "manual"]
- ["Microsoft.EntityFrameworkCore", "DbSet<>", False, "Attach", "(TEntity)", "", "Argument[0]", "Argument[this].Element", "value", "manual"]
- ["Microsoft.EntityFrameworkCore", "DbSet<>", False, "AttachRange", "(System.Collections.Generic.IEnumerable<TEntity>)", "", "Argument[0].WithElement", "Argument[this]", "value", "manual"]
- ["Microsoft.EntityFrameworkCore", "DbSet<>", False, "AttachRange", "(TEntity[])", "", "Argument[0].WithElement", "Argument[this]", "value", "manual"]
- ["Microsoft.EntityFrameworkCore", "DbSet<>", False, "Update", "(TEntity)", "", "Argument[0]", "Argument[this].Element", "value", "manual"]
- ["Microsoft.EntityFrameworkCore", "DbSet<>", False, "UpdateRange", "(System.Collections.Generic.IEnumerable<TEntity>)", "", "Argument[0].WithElement", "Argument[this]", "value", "manual"]
- ["Microsoft.EntityFrameworkCore", "DbSet<>", False, "UpdateRange", "(TEntity[])", "", "Argument[0].WithElement", "Argument[this]", "value", "manual"]
- addsTo:
pack: codeql/csharp-all
extensible: sinkModel

View File

@@ -1,4 +1,12 @@
extensions:
- addsTo:
pack: codeql/csharp-all
extensible: summaryModel
data:
- ["System.Data.Entity", "DbSet<>", False, "Add", "(TEntity)", "", "Argument[0]", "Argument[this].Element", "value", "manual"]
- ["System.Data.Entity", "DbSet<>", False, "AddRange", "(System.Collections.Generic.IEnumerable<TEntity>)", "", "Argument[0].WithElement", "Argument[this]", "value", "manual"]
- ["System.Data.Entity", "DbSet<>", False, "Attach", "(TEntity)", "", "Argument[0]", "Argument[this].Element", "value", "manual"]
- addsTo:
pack: codeql/csharp-all
extensible: sinkModel

View File

@@ -88,31 +88,6 @@ module EntityFramework {
EFSummarizedCallable() { any() }
}
private class DbSetAddOrUpdateRequiredSummaryComponentStack extends RequiredSummaryComponentStack {
override predicate required(SummaryComponent head, SummaryComponentStack tail) {
head = SummaryComponent::element() and
tail = SummaryComponentStack::argument([-1, 0])
}
}
private class DbSetAddOrUpdate extends EFSummarizedCallable {
private boolean range;
DbSetAddOrUpdate() { this = any(DbSet c).getAnAddOrUpdateMethod(range) }
override predicate propagatesFlow(
SummaryComponentStack input, SummaryComponentStack output, boolean preservesValue
) {
(
if range = true
then input = SummaryComponentStack::elementOf(SummaryComponentStack::argument(0))
else input = SummaryComponentStack::argument(0)
) and
output = SummaryComponentStack::elementOf(SummaryComponentStack::qualifier()) and
preservesValue = true
}
}
/** The class `Microsoft.EntityFrameworkCore.DbQuery<>` or `System.Data.Entity.DbQuery<>`. */
class DbQuery extends EFClass, UnboundGenericClass {
DbQuery() { this.hasName("DbQuery<>") }

View File

@@ -209,6 +209,20 @@ summary
| Microsoft.CSharp.RuntimeBinder;Binder;false;SetMember;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.String,System.Type,System.Collections.Generic.IEnumerable<Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo>);;Argument[3].Element;ReturnValue;taint;df-generated |
| Microsoft.CSharp.RuntimeBinder;Binder;false;UnaryOperation;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Linq.Expressions.ExpressionType,System.Type,System.Collections.Generic.IEnumerable<Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo>);;Argument[2];ReturnValue;taint;df-generated |
| Microsoft.CSharp.RuntimeBinder;Binder;false;UnaryOperation;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Linq.Expressions.ExpressionType,System.Type,System.Collections.Generic.IEnumerable<Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo>);;Argument[3].Element;ReturnValue;taint;df-generated |
| Microsoft.EntityFrameworkCore;DbSet<>;false;Add;(TEntity);;Argument[0];Argument[this].Element;value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;AddAsync;(TEntity,System.Threading.CancellationToken);;Argument[0];Argument[this].Element;value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;AddRange;(System.Collections.Generic.IEnumerable<TEntity>);;Argument[0].WithElement;Argument[this];value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;AddRange;(TEntity[]);;Argument[0].WithElement;Argument[this];value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;AddRangeAsync;(System.Collections.Generic.IEnumerable<TEntity>,System.Threading.CancellationToken);;Argument[0].WithElement;Argument[this];value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;AddRangeAsync;(TEntity[]);;Argument[0].WithElement;Argument[this];value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;Attach;(TEntity);;Argument[0];Argument[this].Element;value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;AttachRange;(System.Collections.Generic.IEnumerable<TEntity>);;Argument[0].WithElement;Argument[this];value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;AttachRange;(TEntity[]);;Argument[0].WithElement;Argument[this];value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;GetEnumerator;();;Argument[this].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;GetEnumerator;();;Argument[this].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;Update;(TEntity);;Argument[0];Argument[this].Element;value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;UpdateRange;(System.Collections.Generic.IEnumerable<TEntity>);;Argument[0].WithElement;Argument[this];value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;UpdateRange;(TEntity[]);;Argument[0].WithElement;Argument[this];value;manual |
| Microsoft.Extensions.Caching.Distributed;DistributedCacheEntryExtensions;false;SetAbsoluteExpiration;(Microsoft.Extensions.Caching.Distributed.DistributedCacheEntryOptions,System.DateTimeOffset);;Argument[0];ReturnValue;taint;df-generated |
| Microsoft.Extensions.Caching.Distributed;DistributedCacheEntryExtensions;false;SetAbsoluteExpiration;(Microsoft.Extensions.Caching.Distributed.DistributedCacheEntryOptions,System.DateTimeOffset);;Argument[1];Argument[0];taint;df-generated |
| Microsoft.Extensions.Caching.Distributed;DistributedCacheEntryExtensions;false;SetAbsoluteExpiration;(Microsoft.Extensions.Caching.Distributed.DistributedCacheEntryOptions,System.DateTimeOffset);;Argument[1];ReturnValue;taint;df-generated |
@@ -2671,6 +2685,13 @@ summary
| System.Data.Common;RowUpdatingEventArgs;false;set_BaseCommand;(System.Data.IDbCommand);;Argument[0];Argument[this];taint;df-generated |
| System.Data.Common;RowUpdatingEventArgs;false;set_Command;(System.Data.IDbCommand);;Argument[0];Argument[this];taint;df-generated |
| System.Data.Common;RowUpdatingEventArgs;false;set_Errors;(System.Exception);;Argument[0];Argument[this];taint;df-generated |
| System.Data.Entity.Infrastructure;DbRawSqlQuery<>;false;GetEnumerator;();;Argument[this].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value;manual |
| System.Data.Entity.Infrastructure;DbRawSqlQuery<>;false;GetEnumerator;();;Argument[this].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value;manual |
| System.Data.Entity;DbSet<>;false;Add;(TEntity);;Argument[0];Argument[this].Element;value;manual |
| System.Data.Entity;DbSet<>;false;AddRange;(System.Collections.Generic.IEnumerable<TEntity>);;Argument[0].WithElement;Argument[this];value;manual |
| System.Data.Entity;DbSet<>;false;Attach;(TEntity);;Argument[0];Argument[this].Element;value;manual |
| System.Data.Entity;DbSet<>;false;GetEnumerator;();;Argument[this].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value;manual |
| System.Data.Entity;DbSet<>;false;GetEnumerator;();;Argument[this].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value;manual |
| System.Data.SqlTypes;SqlBinary;false;Add;(System.Data.SqlTypes.SqlBinary,System.Data.SqlTypes.SqlBinary);;Argument[0];ReturnValue;taint;df-generated |
| System.Data.SqlTypes;SqlBinary;false;Add;(System.Data.SqlTypes.SqlBinary,System.Data.SqlTypes.SqlBinary);;Argument[1];ReturnValue;taint;df-generated |
| System.Data.SqlTypes;SqlBinary;false;Concat;(System.Data.SqlTypes.SqlBinary,System.Data.SqlTypes.SqlBinary);;Argument[0];ReturnValue;taint;df-generated |

View File

@@ -18,6 +18,18 @@ summary
| Microsoft.CSharp.RuntimeBinder;Binder;false;SetMember;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.String,System.Type,System.Collections.Generic.IEnumerable<Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo>);;Argument[3].Element;ReturnValue;taint;df-generated |
| Microsoft.CSharp.RuntimeBinder;Binder;false;UnaryOperation;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Linq.Expressions.ExpressionType,System.Type,System.Collections.Generic.IEnumerable<Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo>);;Argument[2];ReturnValue;taint;df-generated |
| Microsoft.CSharp.RuntimeBinder;Binder;false;UnaryOperation;(Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags,System.Linq.Expressions.ExpressionType,System.Type,System.Collections.Generic.IEnumerable<Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo>);;Argument[3].Element;ReturnValue;taint;df-generated |
| Microsoft.EntityFrameworkCore;DbSet<>;false;Add;(TEntity);;Argument[0];Argument[this].Element;value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;AddAsync;(TEntity,System.Threading.CancellationToken);;Argument[0];Argument[this].Element;value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;AddRange;(System.Collections.Generic.IEnumerable<TEntity>);;Argument[0].WithElement;Argument[this];value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;AddRange;(TEntity[]);;Argument[0].WithElement;Argument[this];value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;AddRangeAsync;(System.Collections.Generic.IEnumerable<TEntity>,System.Threading.CancellationToken);;Argument[0].WithElement;Argument[this];value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;AddRangeAsync;(TEntity[]);;Argument[0].WithElement;Argument[this];value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;Attach;(TEntity);;Argument[0];Argument[this].Element;value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;AttachRange;(System.Collections.Generic.IEnumerable<TEntity>);;Argument[0].WithElement;Argument[this];value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;AttachRange;(TEntity[]);;Argument[0].WithElement;Argument[this];value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;Update;(TEntity);;Argument[0];Argument[this].Element;value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;UpdateRange;(System.Collections.Generic.IEnumerable<TEntity>);;Argument[0].WithElement;Argument[this];value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;UpdateRange;(TEntity[]);;Argument[0].WithElement;Argument[this];value;manual |
| Microsoft.Extensions.Caching.Distributed;DistributedCacheEntryExtensions;false;SetAbsoluteExpiration;(Microsoft.Extensions.Caching.Distributed.DistributedCacheEntryOptions,System.DateTimeOffset);;Argument[0];ReturnValue;taint;df-generated |
| Microsoft.Extensions.Caching.Distributed;DistributedCacheEntryExtensions;false;SetAbsoluteExpiration;(Microsoft.Extensions.Caching.Distributed.DistributedCacheEntryOptions,System.DateTimeOffset);;Argument[1];Argument[0];taint;df-generated |
| Microsoft.Extensions.Caching.Distributed;DistributedCacheEntryExtensions;false;SetAbsoluteExpiration;(Microsoft.Extensions.Caching.Distributed.DistributedCacheEntryOptions,System.DateTimeOffset);;Argument[1];ReturnValue;taint;df-generated |
@@ -1858,6 +1870,9 @@ summary
| System.Data.Common;RowUpdatingEventArgs;false;set_BaseCommand;(System.Data.IDbCommand);;Argument[0];Argument[this];taint;df-generated |
| System.Data.Common;RowUpdatingEventArgs;false;set_Command;(System.Data.IDbCommand);;Argument[0];Argument[this];taint;df-generated |
| System.Data.Common;RowUpdatingEventArgs;false;set_Errors;(System.Exception);;Argument[0];Argument[this];taint;df-generated |
| System.Data.Entity;DbSet<>;false;Add;(TEntity);;Argument[0];Argument[this].Element;value;manual |
| System.Data.Entity;DbSet<>;false;AddRange;(System.Collections.Generic.IEnumerable<TEntity>);;Argument[0].WithElement;Argument[this];value;manual |
| System.Data.Entity;DbSet<>;false;Attach;(TEntity);;Argument[0];Argument[this].Element;value;manual |
| System.Data.SqlTypes;SqlBinary;false;Add;(System.Data.SqlTypes.SqlBinary,System.Data.SqlTypes.SqlBinary);;Argument[0];ReturnValue;taint;df-generated |
| System.Data.SqlTypes;SqlBinary;false;Add;(System.Data.SqlTypes.SqlBinary,System.Data.SqlTypes.SqlBinary);;Argument[1];ReturnValue;taint;df-generated |
| System.Data.SqlTypes;SqlBinary;false;Concat;(System.Data.SqlTypes.SqlBinary,System.Data.SqlTypes.SqlBinary);;Argument[0];ReturnValue;taint;df-generated |

View File

@@ -2,3 +2,4 @@ semmle-extractor-options: /nostdlib /noconfig
semmle-extractor-options: --load-sources-from-project:${testdir}/../../../resources/stubs/Newtonsoft.Json/13.0.1/Newtonsoft.Json.csproj
semmle-extractor-options: --load-sources-from-project:../../../resources/stubs/_frameworks/Microsoft.AspNetCore.App/Microsoft.AspNetCore.App.csproj
semmle-extractor-options: ${testdir}/../../../resources/stubs/System.Web.cs
semmle-extractor-options: ${testdir}/../../../resources/stubs/EntityFramework.cs

View File

@@ -57,14 +57,6 @@ summary
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[this].Property[EFCoreTests.MyContext.Persons].Element.Property[EFCoreTests.Person.Id];ReturnValue[jump to get_Persons].Element.Property[EFCoreTests.Person.Id];value;manual |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[this].Property[EFCoreTests.MyContext.Persons].Element.Property[EFCoreTests.Person.Name];ReturnValue[jump to get_PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Person].Property[EFCoreTests.Person.Name];value;manual |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[this].Property[EFCoreTests.MyContext.Persons].Element.Property[EFCoreTests.Person.Name];ReturnValue[jump to get_Persons].Element.Property[EFCoreTests.Person.Name];value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;Add;(T);;Argument[0];Argument[this].Element;value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;AddAsync;(T);;Argument[0];Argument[this].Element;value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;AddRange;(System.Collections.Generic.IEnumerable<T>);;Argument[0].Element;Argument[this].Element;value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;AddRangeAsync;(System.Collections.Generic.IEnumerable<T>);;Argument[0].Element;Argument[this].Element;value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;Attach;(T);;Argument[0];Argument[this].Element;value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;AttachRange;(System.Collections.Generic.IEnumerable<T>);;Argument[0].Element;Argument[this].Element;value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;Update;(T);;Argument[0];Argument[this].Element;value;manual |
| Microsoft.EntityFrameworkCore;DbSet<>;false;UpdateRange;(System.Collections.Generic.IEnumerable<T>);;Argument[0].Element;Argument[this].Element;value;manual |
| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[this].Property[EFTests.MyContext.Addresses].Element.Property[EFTests.Address.Id];ReturnValue[jump to get_Addresses].Element.Property[EFTests.Address.Id];value;manual |
| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[this].Property[EFTests.MyContext.Addresses].Element.Property[EFTests.Address.Id];ReturnValue[jump to get_PersonAddresses].Element.Property[EFTests.PersonAddressMap.Address].Property[EFTests.Address.Id];value;manual |
| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[this].Property[EFTests.MyContext.Addresses].Element.Property[EFTests.Address.Id];ReturnValue[jump to get_Persons].Element.Property[EFTests.Person.Addresses].Element.Property[EFTests.Address.Id];value;manual |
@@ -123,14 +115,6 @@ summary
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[this].Property[EFTests.MyContext.Persons].Element.Property[EFTests.Person.Id];ReturnValue[jump to get_Persons].Element.Property[EFTests.Person.Id];value;manual |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[this].Property[EFTests.MyContext.Persons].Element.Property[EFTests.Person.Name];ReturnValue[jump to get_PersonAddresses].Element.Property[EFTests.PersonAddressMap.Person].Property[EFTests.Person.Name];value;manual |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[this].Property[EFTests.MyContext.Persons].Element.Property[EFTests.Person.Name];ReturnValue[jump to get_Persons].Element.Property[EFTests.Person.Name];value;manual |
| System.Data.Entity;DbSet<>;false;Add;(T);;Argument[0];Argument[this].Element;value;manual |
| System.Data.Entity;DbSet<>;false;AddAsync;(T);;Argument[0];Argument[this].Element;value;manual |
| System.Data.Entity;DbSet<>;false;AddRange;(System.Collections.Generic.IEnumerable<T>);;Argument[0].Element;Argument[this].Element;value;manual |
| System.Data.Entity;DbSet<>;false;AddRangeAsync;(System.Collections.Generic.IEnumerable<T>);;Argument[0].Element;Argument[this].Element;value;manual |
| System.Data.Entity;DbSet<>;false;Attach;(T);;Argument[0];Argument[this].Element;value;manual |
| System.Data.Entity;DbSet<>;false;AttachRange;(System.Collections.Generic.IEnumerable<T>);;Argument[0].Element;Argument[this].Element;value;manual |
| System.Data.Entity;DbSet<>;false;Update;(T);;Argument[0];Argument[this].Element;value;manual |
| System.Data.Entity;DbSet<>;false;UpdateRange;(System.Collections.Generic.IEnumerable<T>);;Argument[0].Element;Argument[this].Element;value;manual |
neutral
sourceNode
sinkNode

View File

@@ -10,17 +10,12 @@ namespace System.Data.Entity
{
}
public class DbSet<T> : IEnumerable<T>
public class DbSet<TEntity> : IEnumerable<TEntity>
{
public void Add(T t) { }
public System.Threading.Tasks.Task<int> AddAsync(T t) => null;
public void AddRange(IEnumerable<T> t) { }
public System.Threading.Tasks.Task<int> AddRangeAsync(IEnumerable<T> t) => null;
public void Attach(T t) { }
public void AttachRange(IEnumerable<T> t) { }
public void Update(T t) { }
public void UpdateRange(IEnumerable<T> t) { }
IEnumerator<T> IEnumerable<T>.GetEnumerator() => null;
public void Add(TEntity t) { }
public void AddRange(IEnumerable<TEntity> t) { }
public void Attach(TEntity t) { }
IEnumerator<TEntity> IEnumerable<TEntity>.GetEnumerator() => null;
IEnumerator IEnumerable.GetEnumerator() => null;
}
@@ -59,17 +54,22 @@ namespace System.Data.Entity.Infrastructure
namespace Microsoft.EntityFrameworkCore
{
public class DbSet<T> : IEnumerable<T>
public class DbSet<TEntity> : IEnumerable<TEntity>
{
public void Add(T t) { }
public System.Threading.Tasks.Task<int> AddAsync(T t) => null;
public void AddRange(IEnumerable<T> t) { }
public System.Threading.Tasks.Task<int> AddRangeAsync(IEnumerable<T> t) => null;
public void Attach(T t) { }
public void AttachRange(IEnumerable<T> t) { }
public void Update(T t) { }
public void UpdateRange(IEnumerable<T> t) { }
IEnumerator<T> IEnumerable<T>.GetEnumerator() => null;
public void Add(TEntity t) { }
public System.Threading.Tasks.Task<int> AddAsync(TEntity t, System.Threading.CancellationToken ct = default) => null;
public void AddRange(IEnumerable<TEntity> t) { }
public void AddRange(TEntity[] t) { }
public System.Threading.Tasks.Task<int> AddRangeAsync(IEnumerable<TEntity> t, System.Threading.CancellationToken ct = default) => null;
public System.Threading.Tasks.Task<int> AddRangeAsync(TEntity[] t) => null;
public void Attach(TEntity t) { }
public void AttachRange(IEnumerable<TEntity> t) { }
public void AttachRange(TEntity[] t) { }
public void Update(TEntity t) { }
public void UpdateRange(IEnumerable<TEntity> t) { }
public void UpdateRange(TEntity[] t) { }
IEnumerator<TEntity> IEnumerable<TEntity>.GetEnumerator() => null;
IEnumerator IEnumerable.GetEnumerator() => null;
}