我有一个表,在具有Ordinal列的表上具有唯一索引.例如,表格将包含以下列:
TableId,ID1,ID2,Ordinal
唯一索引跨越ID1,ID2,Ordinal列.
我遇到的问题是,当从数据库中删除记录时,我会重新排序序数,以便它们再次顺序.我的删除功能如下所示:
public void Delete(int id)
{
var tableObject = Context.TableObject.Find(id);
Context.TableObject.Remove(tableObject);
ResequenceOrdinalsAfterDelete(tableObject);
}
Run Code Online (Sandbox Code Playgroud)
问题在于,当我调用Context.SaveChanges()时,它会打破唯一索引,因为它似乎以不同于传递的顺序执行语句.例如,发生以下情况:
代替:
这是EF的正确行为吗?如果是,是否有一种方法可以覆盖此行为以强制执行顺序?
如果我没有正确解释,请告诉我...
我刚刚下载了EntityFramework.dll v4.3.我发现了一些用于比较的问题DbContext对ObjectContext.但其中大部分来自2010年或2011年初.
我想更多地了解这个主题.具体来说,有没有DbContext可以拿到书的书?我还想知道,截至今天,DbContext将它与其哥哥比较时有哪些局限性ObjectContext?
我意识到它DbContext更紧凑,因为它暴露更少的属性.这告诉我,我应该从中迁移ObjectContext.但是,如果我进行此迁移,我会放弃任何功能吗?例如,我读过DbContext没有STE(自跟踪实体)功能.这是否仍然适用,这是一个问题吗?
我创建了一个单独的类库项目来存储数据库上下文和模型类.在同一个解决方案中,我创建了一个ASP.NET MVC项目并引用了类库项目,并在项目的Web.config文件中包含了数据库上下文的连接字符串.
但是,当我尝试添加一个Controller(带有视图,使用EF)时,我收到以下错误:
调用的目标抛出了异常.
我能够在Add Controller下拉框中看到Database Context和Model Classes,所以我认为它不是一个引用问题.
如果有人也遇到此错误(使用此配置),将非常感谢您的帮助.
我在一个运行带有Sqlite的Entity Framework Core的Dotnet Core项目中有一个WebApi控制器.
动作中的此代码会出现错误:
var t1 = _dbContext.Awesome.FirstOrDefaultAsync(a => [...]);
var t2 = _dbContext.Bazinga.FirstOrDefaultAsync(b => [...]);
var r1 = await t1;
var r2 = await t2;
Run Code Online (Sandbox Code Playgroud)
错误是:
Microsoft.EntityFrameworkCore.Query.RelationalQueryCompilationContextFactory:错误:迭代查询结果时数据库中发生异常.System.ObjectDisposedException:已关闭安全句柄
Microsoft.EntityFrameworkCore.Query.RelationalQueryCompilationContextFactory:错误:迭代查询结果时数据库中发生异常.System.InvalidOperationException:只能在连接打开时调用ExecuteReader.
对我来说,这两个错误都表明了一些事情正在发生DbContext,比如过早处置(尽管不是DbContext自己).该DbContext被注入在使用DOTNET核心的"通常方式"的管道控制器的构造,配置如下所示(从我的Startup.cs ConfigureServices方法体):
services.AddDbContext<ApplicationContext>(options => options.UseSqlite(connectionString));
Run Code Online (Sandbox Code Playgroud)
如果我将上面的错误产生代码改为:
var r1 = await _dbContext.Awesome.FirstOrDefaultAsync(a => [...]);
var r2 = await _dbContext.Bazinga.FirstOrDefaultAsync(b => [...]);
Run Code Online (Sandbox Code Playgroud)
...我没有看到提到的错误,因此得出的结论是,在我的同一个实例上同时运行多个任务DbContext(如上所述注入)是造成问题的原因.显然,这是一个意外的.
问题:
DbContext吗?实际上我是从Blazor和开始的EF Core。在注册时DbContext我陷入困境。可以通过或 进行DbContext注册。但有什么区别呢?AddDbContextAddDbContextFactory
builder.Services.AddDbContext<DataContext>(opt => opt.UseSqlServer("..."));\nbuilder.Services.AddDbContextFactory<DataContext>(opt => opt.UseSqlServer("..."));\nRun Code Online (Sandbox Code Playgroud)\n从文档我得到以下信息:
\nAddDbContext:
\n\n使用依赖注入时使用此方法...
\n
\n\nEntity Framework Core 不支持在同一 Microsoft.EntityFrameworkCore.DbContext 实例上运行多个并行操作。这包括异步查询的并行执行以及来自多个线程的任何显式并发使用。
\n
AddDbContextFactory:
\n\n建议为 Blazor 应用程序以及依赖项注入范围与上下文生命周期不一致的其他情况注册工厂...
\n
\n\n为了方便起见,此方法还将上下文类型本身注册为作用域服务。这允许上下文实例直接从依赖项注入范围解析或由工厂创建(视情况而定)。
\n
因此,我们可以全局地说,如果程序需要DbContext从不同的线程访问,或者同时需要注册上下文,AddDbContextFactory因为当它被创建时(例如在控制器中),lifttime 被设置为作用域,所以我们每次得到一个新的DbContext?
private readonly DataContext _dbContext;\n\npublic BlogController(IDbContextFactory<DataContext> dbFactory)\n{\n // Will be created as SCOPED DbContext?\n _dbContext = dbFactory.CreateDbContext();\n}\nRun Code Online (Sandbox Code Playgroud)\n我还在这里发现了类似的问题。AddDbContext …
看起来实体框架(来自NuGet的最新版本)在为导航属性构建连接时可能忽略HasRequired配置,而不是定义的第一个.
例如,给定具有以下配置的POCO对象(Person):
var person = modelBuilder.Entity<Person>();
person.ToTable("The_Peoples");
person.HasKey(i => i.Id);
person.Property(i => i.Id).HasColumnName("the_people_id");
person.HasRequired(i => i.Address)
.WithMany()
.Map(map => map.MapKey("address_id"));
person.HasRequired(i => i.WorkPlace)
.WithMany()
.Map(map => map.MapKey("work_place_id"));
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用以下查询加载人员列表:
myContext.Set<People>()
.Include(o => o.Address)
.Include(o => o.WorkPlace);
Run Code Online (Sandbox Code Playgroud)
实体框架生成以下查询:
FROM [dbo].[The_Peoples] AS [Extent1]
INNER JOIN [dbo].[The_Addresses] AS [Extent2] ON [Extent1].[address_id] = [Extent2].[address_id]
LEFT OUTER JOIN [dbo].[The_Work_Places] AS [Extent3] ON [Extent1].[work_place_id] = [Extent3].[work_place_id]
Run Code Online (Sandbox Code Playgroud)
请注意,*The_Addresses*表的连接是内连接(如预期的那样),但是,*The_Work_Places*的后续连接是外连接.鉴于Address和WorkPlace属性都标记为必需,我希望两个连接都是内连接.我还尝试使用Required属性标记Address和WorkPlace属性,但这没有任何效果.
这是一个错误还是我可能错误配置了什么?建议?
我有两个C#类
public class SearchResult
{
public int? EntityId { get; set; }
public string Name { get; set; }
public Address RegisteredAddress { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和
public class Address
{
public int? AddressId { get; set; }
public string Address1 { get; set; }
public string Address2 { get; set; }
public string Address3 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这在dbContext调用中用于通过EF5从数据库中映射返回的对象
using (DbEntities db = new DbEntities())
{
querySearchResult = db.Database.SqlQuery<SearchResult>(
@"SELECT e.entity_id AS EntityId, e.entity_reg_name AS Name,
a.address_1 …Run Code Online (Sandbox Code Playgroud) 我有一个与我无关的实体dbcontext.我想改变这一点.但是,已经有另一个相同实体的实例附加到dbcontext.如果我只是添加我的新实体,我会收到一个错误,即已经附加了具有相同主键的实体.
我尝试了多种不同的删除旧实体的变体,dbcontext没有任何成功.如何用新的实例替换旧实例?
注意:我不想复制值,我想将我的新实体的这个实例附加到dbcontext.
var entity = new MyEntity { Id = 1 };
var logicalDuplicate = dbcontext.Set<MyEntity >().Local
.FirstOrDefault(e => e.Equals(entity ));
if (logicalDuplicate != null)
{
// remove logicalDuplicate from dbcontext
}
dbcontext.MyEntity.Attach(entity);
Run Code Online (Sandbox Code Playgroud)
澄清:我已经覆盖Equals检查Id而不是参考.
我需要为我的桌面应用程序用于连接到我们的一个内部数据库的每个环境(开发,接受和生产)创建单独的Windows服务帐户.
已向这些帐户添加了一个全局组以提供访问权限,从而需要使用模拟进行Windows身份验证访问.
连接字符串数据被加密并存储在网络中,由类库访问以确保安全性.
如果我没有模拟,并使用基础构造函数作为DbContext接受连接字符串的基类,它的工作原理是因为我的个人帐户被分配到同一个全局组.但是,当我将DbContext对象的实例化封装为模拟时,它会在内部异常失败时声明灾难性故障而外部异常状态
提供程序未返回
ProviderManifest实例.
例如:
Console.WriteLine(Environment.UserName); //This shows me! So no impersonation yet!
using (new Impersonator("AppUser", "mydomain", "notapassword"))
{
Console.WriteLine(Environment.UserName); //This shows as AppUSER! So it works!
using (BillMarkContext dbContext = new BillMarkContext())
{
//Read each bill mark object
foreach (BillMarkCode code in dbContext.BillMarkCodes.AsEnumerable<BillMarkCode>())
Console.WriteLine(code.Code);
}
}
public partial class BillMarkContext : DbContext
{
private static string _connection = "Integrated Security=True;Persist Security Info=True;Initial Catalog=MyDB;Data Source=DBServer";
public …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个实体类,它将通过只读属性公开相关集合,如下所示:
public class MyEntity: Entity
{
public int Id{ get; private set; }
private IList<RelatedEntity> _relatedEntities = new List<RelatedEntity>();
public IReadOnlyList<RelatedEntity> RelatedEntities => _relatedEntities.ToList().AsReadOnly();
}
Run Code Online (Sandbox Code Playgroud)
构建器类如下所示:
public void Configure(EntityTypeBuilder<MyEntity> builder)
{
builder.HasKey(x=>x.Id);
builder.Property<IReadOnlyList<RelatedEntity>>("RelatedEntities")
.HasField("_relatedEntities ")
.UsePropertyAccessMode(PropertyAccessMode.Field);
}
Run Code Online (Sandbox Code Playgroud)
它可以构建,但在运行时崩溃,但有以下例外:
InvalidOperationException:“IList”类型的指定字段“_latedEntities”不能用于“IReadOnlyList”类型的属性“MyEntity.RelatedEntities”。只能使用可从属性类型分配的类型的支持字段。
您能提供一个如何处理这个问题的工作示例吗?