Questions tagged «entity-framework»

有关ADO.NET实体框架的问题,请参阅.NET Framework的对象关系映射(ORM)工具。如果适用,请添加特定于版本的标签。请勿对实体框架核心问题使用此标签。请改用entity-framework-core。

3
如何禁用EF代码优先的链接表的级联删除?
我想使用实体框架代码优先的链接表禁用级联删除。例如,如果许多用户具有许多角色,而我尝试删除一个角色,则除非当前没有与该角色相关联的用户,否则我希望该删除被阻止。我已经删除了我的级联删除约定OnModelCreating: protected override void OnModelCreating(DbModelBuilder modelBuilder) { ... modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 然后,我设置了用户角色链接表: modelBuilder.Entity<User>() .HasMany(usr => usr.Roles) .WithMany(role => role.Users) .Map(m => { m.ToTable("UsersRoles"); m.MapLeftKey("UserId"); m.MapRightKey("RoleId"); }); 但是,当EF创建数据库时,它会为外键关系创建一个删除级联,例如。 ALTER TABLE [dbo].[UsersRoles] WITH CHECK ADD CONSTRAINT [FK_dbo.UsersRoles_dbo.User_UserId] FOREIGN KEY([UserId]) REFERENCES [dbo].[User] ([UserId]) ON DELETE CASCADE GO ALTER TABLE [dbo].[UsersRoles] WITH CHECK ADD CONSTRAINT [FK_dbo.UsersRoles_dbo.Role_RoleId] …

9
实体框架:当数据库更改时,如何刷新模型?
如果从数据库构建edmx文件,然后数据库更改,那么如何获取模型来进行更改? 您删除整个模型并重新生成,还是可以检测到更改? 我看到一则帖子提到“更新您的模型” rt。在edmx文件上使用鼠标命令,但是我看不到它。 更新edmx以反映数据库中所做的更改(.net linq-to-entities) 我才刚开始。

5
是否应该使用实体框架4.1和MVC3启用或禁用动态代理?
有人可以提供一些建议或指出一些博客/文章来帮助做出这一决定吗?代理对我来说似乎很陌生,我不愿意使用它们。我喜欢通过在模型中使用虚拟属性来控制延迟加载的功能,但这几乎是我可以看到的所有好处。我的应用程序是一个简单的MVC Web应用程序,当实体经历更改状态时,我不需要为上下文绑定任何挂钩。 无论如何,这是我目前优缺点非常有限的清单,请让我知道我是否在这方面不满意。 优点 在“保存”或“更新”上,我可以无缝地应用“更改” 延迟加载配置非常容易。 缺点 对于我的实体,以前从未使用过代理,这是一种方法上的变化,对我自己和团队成员而言似乎不舒服。 难以调试。 如果我要序列化/反序列化,则需要额外的代码 在“保存”或“更新”上,代理必须与从上下文中检索到的对象相同。

5
在LINQ中向实体左加入?
我正在尝试将LINQ用于实体。 我在以下方面遇到问题:我希望它这样做: SELECT T_Benutzer.BE_User ,T_Benutzer_Benutzergruppen.BEBG_BE FROM T_Benutzer LEFT JOIN T_Benutzer_Benutzergruppen ON T_Benutzer_Benutzergruppen.BEBG_BE = T_Benutzer.BE_ID 我最接近的是: var lol = ( from u in Repo.T_Benutzer //where u.BE_ID == 1 from o in Repo.T_Benutzer_Benutzergruppen.DefaultIfEmpty() // on u.BE_ID equals o.BEBG_BE where (u.BE_ID == o.BEBG_BE || o.BEBG_BE == null) //join bg in Repo.T_Benutzergruppen.DefaultIfEmpty() // on …

5
如何在Microsoft.AspNet.Identity.EntityFramework.IdentityUser中更改ID的类型
(ASP.NET MVC 5,EF6,VS2013) 我试图弄清楚如何将“ Id”字段的类型从字符串更改为int类型: Microsoft.AspNet.Identity.EntityFramework.IdentityUser 为了使新用户帐户与整数ID而不是GUID相关联。但是,这似乎比在派生的用户类中简单地添加一个类型为int的新Id属性要复杂得多。看一下这个方法签名: (来自程序集Microsoft.AspNet.Identity.Core.dll) public class UserManager<TUser> : IDisposable where TUser : global::Microsoft.AspNet.Identity.IUser { ... public virtual Task<IdentityResult> AddLoginAsync(string userId, UserLoginInfo login); ... } 因此,似乎还有其他方法已植入ASP.NET身份框架中,这些方法要求userId为字符串。我还需要重新实现这些类吗? 关于为什么我不想在用户表中存储ID的GUID的解释: -将有其他表通过外键将数据与用户表相关联。(当用户将内容保存在网站上时。)我没有理由使用较大的字段类型并花费额外的数据库空间,而没有明显的优势。(我知道还有其他关于使用GUID和int id的文章,但是似乎很多人建议int id更快,使用更少的空间,这仍然让我感到疑惑。) -我计划公开一个宁静的端点,以允许用户检索有关特定用户的数据。我认为: /users/123/name 比...干净 /users/{af54c891-69ba-4ddf-8cb6-00d368e58d77}/name 有谁知道ASP.NET团队为何决定以这种方式实现ID?在尝试将其更改为int类型时,我是不是目光短浅?(也许我缺少一些好处。) 谢谢... -本

4
“ LINQ to Entities不支持LINQ表达式节点类型'Invoke'”-烦死了!
稍后在我的EF中,我试图传递一个匿名函数以用作Linq查询的一部分。该函数将传入INT并返回BOOL(u.RelationTypeId为INT)。以下是我的函数的简化版本: public IEnumerable<UserBandRelation> GetBandRelationsByUser(Func<int, bool> relation) { using (var ctx = new OpenGroovesEntities()) { Expression<Func<UsersBand, bool>> predicate = (u) => relation(u.RelationTypeId); var relations = ctx.UsersBands.Where(predicate); // mapping, other stuff, back to business layer return relations.ToList(); } } 但是,我得到上述错误。似乎我通过从函数构建谓词来使所有事情都正确。有任何想法吗?谢谢。

4
是否在单独的程序集中启用上下文迁移?
我有一个要运行的项目,update-database但我的模型和上下文位于单独的项目中。 如果我运行enable-migrations,则会出现此错误:在程序集“ MyProject”中未找到任何上下文类型。 大概是因为我的上下文在MyProject.MVC中。 如果我enable-migrations针对MyProject.MVC运行,则必须添加一个应用程序配置文件。我不想这样做,因为我想在许多项目中使用代码。 所以我可以enable-migrations针对MyProject运行,并以某种方式告诉它在MyProject.MVC中查找上下文吗?

2
如何在实体框架核心模型中使用C#8.0可空引用类型?
我在.NET Core 3.0项目上启用C#8.0可空引用类型。该项目使用Entity Framework Core 3.0访问数据库。 以下是标题不应为null的数据模型。 public class Vehicle { public int Id { get; private set; } public string Title { get; private set; } // Entity Framework Core is instructed to bind to the private _drivers field in a configuration builder private readonly List<Driver> _drivers = new …

2
如何在.NET Core 3.0实体框架中执行组联接?
随着对.NET Core 3.0的更改,我得到了 ... NavigationExpandingExpressionVisitor'失败。这可能表示EF Core中存在错误或限制。有关更多详细信息,请参阅 https://go.microsoft.com/fwlink/?linkid=2101433。)---> System.InvalidOperationException:处理LINQ表达式'GroupJoin,... 这是一个非常简单的查询,因此必须有一种在.NET CORE 3.0中执行该查询的方法: var queryResults1 = await patients .GroupJoin( _context.Studies, p => p.Id, s => s.Patient.Id, (p, studies) => new { p.DateOfBirth, p.Id, p.Name, p.Sex, Studies =studies.Select(s1=>s1) } ) .AsNoTracking().ToListAsync(); 我基本上是在寻找一个Linq查询(或上面的方法语法),它将查询与研究合并到患者中,并将研究设置为空列表,如果给定患者没有研究,则将其设置为null。 有任何想法吗?这在.NET Core 2.2中正常工作。此外,上面的MSFT链接还提到,密钥突破更改与客户端评估有关,并且避免了生成的查询读取整个表,然后必须对这些表进行联接或过滤。但是,通过此简单查询,可以在服务器端轻松进行联接。

3
实体框架核心中的强类型ID
我正在尝试创建一个强类型的Id类,该类现在在内部保持“ long”。实施如下。我在实体中使用此控件时遇到的问题是,实体框架向我发送一条消息,指出属性ID已映射到其上。请参阅IEntityTypeConfiguration下面的内容。 注意:我的目标不是严格的DDD实现。因此,在评论或回答时请记住这一点。键入后的整个id Id是供开发人员进入的项目,他们被强烈键入要在其所有实体中使用Id,当然可以转换为long(或BIGINT)-但对于其他人则很清楚。 在类和配置下面,这不起作用。可以在https://github.com/KodeFoxx/Kf.CleanArchitectureTemplate.NetCore31中找到该存储库, Id上的课程(现在已注释掉):https : //github.com/KodeFoxx/Kf.CleanArchitectureTemplate.NetCore31/blob/master/Source/Common/Kf.CANetCore31/DomainDrivenDesign/Id.cs Entity和ValueObject类(Entity属性Id的类型为Id.cs(在上面):https : //github.com/KodeFoxx/Kf.CleanArchitectureTemplate.NetCore31/tree/master/Source/Common/Kf.CANetCore31/DomainDrivenDesign 可在以下位置进行配置:https : //github.com/KodeFoxx/Kf.CleanArchitectureTemplate.NetCore31/tree/master/Source/Infrastructure/Persistence/Kf.CANetCore31.Infrastructure.Persistence.Ef/EntityTypeConfigurations Id类实现(现在标记为过时,因为在找到解决方案之前我放弃了这个想法) namespace Kf.CANetCore31.DomainDrivenDesign { [DebuggerDisplay("{DebuggerDisplayString,nq}")] [Obsolete] public sealed class Id : ValueObject { public static implicit operator Id(long value) => new Id(value); public static implicit operator long(Id value) => value.Value; public static implicit operator Id(ulong value) …

2
实体框架中的用户定义表生成了错误的查询
我认为我目前在Entity Framework 6中以及可能在ADO.NET中遇到错误。由于有最后期限,所以我不确定是否可以等待此错误被修复,希望有人可以帮助我进行整洁的工作。 问题是查询在应为0.01和0.05的位置使用值1和5。但是奇怪的是0.1似乎可以正常工作 当前生成的查询是:(从SQL Server Profiler获取) declare @p3 dbo.someUDT insert into @p3 values(NULL,5) insert into @p3 values(5,0.10) insert into @p3 values(NULL,1) insert into @p3 values(1,2) exec sp_executesql N'Select * from @AName',N'@AName [dbo].[someUDT] READONLY',@AName=@p3 正确的代码是: declare @p3 dbo.someUDT insert into @p3 values(NULL,0.05) insert into @p3 values(0.05,0.10) insert into @p3 values(NULL,0.01) …

3
在EF Core中指定Azure SQL Server版本而不中断本地开发
实体框架核心引入了HasServiceTier和HasPerformanceLevel方法来更改Azure SQL服务器的版本。您可以像这样在OnModelCreating中使用它们: protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.HasServiceTier("Basic"); modelBuilder.HasPerformanceLevel("Basic"); } 如果您使用Add-Migration Add-Migration,您将获得如下迁移: public partial class ChangedDatabaseServiceTierToBasic : Migration { protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.AlterDatabase() .Annotation("SqlServer:EditionOptions", "EDITION = 'Basic', SERVICE_OBJECTIVE = 'Basic'"); } protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.AlterDatabase() .OldAnnotation("SqlServer:EditionOptions", "EDITION = 'Basic', SERVICE_OBJECTIVE = 'Basic'"); …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.