我正在使用 EF 4.1,带有延迟加载的 POCO。
我运行的一些示例查询:
var discountsCount = product.Discounts.Count();
var currentDiscountsCount = product.Discounts.Count(d=>d.IsCurrent);
var expiredDiscountsCount = product.Discounts.Count(d=>d.IsExpired);
Run Code Online (Sandbox Code Playgroud)
我想知道的是,我的查询是否有意义,或者性能不佳:
我是每次都访问数据库,还是结果来自 DbContext 中的缓存数据?
每次都可以“从头开始”访问导航属性,如上所述,还是应该缓存它们然后对它们执行更多查询,例如:
var discounts = product.Discounts;
var current = discounts.Count(d=>d.IsCurrent);
var expired = discounts.Count(d=>d.Expired);
Run Code Online (Sandbox Code Playgroud)
对于像下面这样的复杂情况,它是拉取整个集合然后对其执行本地操作,还是构造了一个专门的 SQL 查询,这意味着我无法重用结果以避免再次访问数据库:
var chained = discounts.OrderBy(d=>d.CreationDate).Where(d=>d.CreationDate < DateTime.Now).Count();
Run Code Online (Sandbox Code Playgroud)
感谢您的建议!
根据以下评论进行编辑
所以一旦我调用一个导航属性(它是一个集合),它就会加载整个对象图。但是,如果我使用.Count(d=>d...)orSelect(d=>d...)或Min(d=>d...)等过滤该集合呢?它是否也加载整个图形,或者仅加载最终数据?
我有一个 MVC 应用程序,用户可以在其中选择公司福利,有 10 种不同的福利,但他们最多不能拥有全部 10 种福利。在我看来,我列出了十个带有单选按钮的列表,以指示它们是否需要。控制器中还会执行计算,将所有值加在一起得出总计。
作为我的控制器中的示例 -
newuser.LifeAssurance.LifeAssuranceRequired = viewModel.LifeAssuranceRequired;
newuser.LifeAssurance.LifeAssuranceSchemeName = viewModel.LifeAssuranceSchemeName;
newuser.LifeAssurance.LifeAssuranceProviderName = viewModel.LifeAssuranceProviderName;
newuser.LifeAssurance.LifeAssuranceBenefitLevel = viewModel.LifeAssuranceBenefitLevel;
newuser.LifeAssurance.LifeAssuranceEmployerCost = viewModel.LifeAssuranceEmployerCost;
newuser.LifeAssurance.LifeAssuranceEmployeeCost = viewModel.LifeAssuranceEmployeeCost;
Run Code Online (Sandbox Code Playgroud)
由于用户可能决定不选择此好处,如果他们没有在视图模型中做出选择,是否可以将成本分配为 0?我可以检查它是否为空并在这种情况下添加 0 吗?
我有以下型号:
public class Company
{
//Primary key
public string ID { get; set; }
//Foreign key
public int? LogotypeID { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和
public class Logotype
{
//Primary key
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int? ID { get; set; }
//Foreign key
public string CompanyID { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如何从公司表中删除标识而不删除公司行?
使用:
http://msdn.microsoft.com/en-us/library/system.data.entity.dbset.remove
(v=vs.113).aspx DbSet.Remove(Logotype) 会引发以下异常:
{"The DELETE statement conflicted with the REFERENCE constraint \"FK_dbo.Companies_dbo.Logotypes_LogotypeID\". The conflict occurred in database \"ShipReg\", table \"dbo.Companies\", column 'LogotypeID'.\r\nThe statement has been terminated."} …Run Code Online (Sandbox Code Playgroud) 我正在为我的项目使用实体代码首次迁移。我已经启动并运行了系统。但是,我需要添加一个新的 Guid 列,它是一个外键。在尝试更新数据库时,我收到以下错误:
ALTER TABLE 语句与 FOREIGN KEY 约束“FK_dbo.Categories_dbo.aspnet_Roles_RoleId”冲突。冲突发生在数据库“HelpDesk”、表“dbo.aspnet_Roles”、“RoleId”列中。
所以我做了一些研究,发现Entity Framework 6 Code first Default value。但是,我无法弄清楚如何让它为 Guid 设置默认值。这是我试过的代码:
这是迁移:
public override void Up()
{
AddColumn("dbo.Categories", "RoleId", c => c.Guid(nullable: false, defaultValue: "4468ACB7-AD6F-471E-95CF-615115EA3A76"));
CreateIndex("dbo.Categories", "RoleId");
AddForeignKey("dbo.Categories", "RoleId", "dbo.aspnet_Roles", "RoleId");
}
public override void Down()
{
DropForeignKey("dbo.Categories", "RoleId", "dbo.aspnet_Roles");
DropIndex("dbo.Categories", new[] { "RoleId" });
DropColumn("dbo.Categories", "RoleId");
}
Run Code Online (Sandbox Code Playgroud)
如果我切换到此代码,我能够摆脱所有构建错误(但如果我运行 Update-database,仍然会出现 Alter Table 错误:
AddColumn("dbo.Categories", "RoleId", c => c.Guid(nullable: false, identity: false, defaultValue: null));
Run Code Online (Sandbox Code Playgroud)
如何将其转换为添加特定 Guid 作为默认值?
我正在开发一个 ASP.NET MVC 项目。我正在使用实体框架代码优先方法与数据库交互。但我在为实体的自引用外键设置级联删除时遇到问题。
这是我的带有自引用外键的实体类
public class Category
{
public int Id { get; set; }
[Required]
[MaxLength(50)]
public string Name { get; set; }
[MaxLength(55)]
public string MmName { get; set; }
public int? ParentId { get; set; }
[ForeignKey("ParentId")]
public virtual Category ParentCategory { get; set; }
public virtual ICollection<Category> Categories { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是我的背景
public class StoreContext : DbContext
{
public StoreContext():base("DefaultConnection")
{
}
public DbSet<Category> Categories { get; set; }
protected override void OnModelCreating(DbModelBuilder …Run Code Online (Sandbox Code Playgroud) asp.net entity-framework foreign-keys ef-code-first entity-framework-migrations
我之前曾在这里问过一个关于类似主题的问题,但后来采取了不同的方法。这是我的模型:
public class ApplicationUser : IdentityUser<int, CustomUserLogin, CustomUserRole,CustomUserClaim>
{
public ApplicationUser()
{
Friends = new List<Friend>();
}
[Required]
public string Alias { get; set; }
public virtual ICollection<Friend> Friends { get; set; }
}
public class Friend
{
public virtual int Id { get; set; }
public virtual ApplicationUser RequestedBy { get; set; }
public virtual ApplicationUser RequestedTo { get; set; }
public DateTime? RequestTime { get; set; }
public FriendRequestFlag FriendRequestFlag { get; set; }
}
public enum FriendRequestFlag …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用实体框架迁移在 mySQL 数据库中创建一个函数。当我直接在 MySQL Workbench 中运行 SQL 时,它运行良好,但在 EF 迁移中运行时却失败了。
如何使用 EF 迁移创建函数?
Sql(@"
DROP function IF EXISTS `f_JumperName`;
DELIMITER $$
CREATE FUNCTION `f_JumperName`
(
JumperID int
)
RETURNS varchar(500)
BEGIN
DECLARE result VARCHAR(500);
SELECT j.LastName + ', ' + j.FirstName
INTO result
FROM Jumper j
WHERE j.JumperID = JumperID;
RETURN x;
END$$
DELIMITER ;
");
Run Code Online (Sandbox Code Playgroud)
错误消息:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在 'DELIMITER $$ CREATE FUNCTION f_JumperName
(...
我尝试使用实体框架与代码优先和流畅的API来实现一对多关系
一方面,我有ClassDefinitionEntity类:
public class ClassDefinitionEntity{
public string LocalClassIsin { get; set; }
public ICollection<PcfPublishingDefinitionEntity> PublishingDefinitions { get; set; }
public ClassDefinitionEntity()
{
PublishingDefinitions = new List<PcfPublishingDefinitionEntity>();
}
}
Run Code Online (Sandbox Code Playgroud)
在许多方面,PcfPublishingDefinitionEntity类:
public class PcfPublishingDefinitionEntity
{
public int ClassId { get; set; }
public ClassDefinitionEntity ClassDefinition { get; set;}
public PcfFormatEnum Format { get; set; }
public PcfPublishingChannelEnum Channel { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的列名称不遵循实体约定,因此OnModelCreating中的代码如下所示:
protected override void OnModelCreating(DbModelBuilder modelBuilder){
...
modelBuilder.Entity<PcfPublishingDefinitionEntity()
.ToTable("IFM_PCF_PUBLISHING_DEFINITION");
modelBuilder.Entity<PcfPublishingDefinitionEntity>()
.HasKey(e => new …Run Code Online (Sandbox Code Playgroud) 我以为这很容易,但是...
您如何强制EF6使用nvarchar(MAX)?
我试过了:
[Column(TypeName = "nvarchar(MAX)")]
Run Code Online (Sandbox Code Playgroud)
和
[Column(TypeName = "nvarchar")]
[MaxLength()]
Run Code Online (Sandbox Code Playgroud)
和
modelBuilder.Entity<Date>().Property(o => o.test).HasColumnType("nvarchar(MAX)");
Run Code Online (Sandbox Code Playgroud)
我正在使用EF6.2.0和SQL2014 Express
我首先使用代码和Entity Framework Core中的流畅API来确定属性的行为。
我想知道是否有任何方法可以替换这部分。
modelBuilder.Entity<Person>()
.Property(b => b.Name)
.IsRequired();
modelBuilder.Entity<Person>()
.Property(b => b.LastName)
.IsRequired();
modelBuilder.Entity<Person>()
.Property(b => b.Age)
.IsRequired();
Run Code Online (Sandbox Code Playgroud)
用这样的东西:
modelBuilder.Entity<Person>()
.AllProperties()
.IsRequired();
Run Code Online (Sandbox Code Playgroud)
关键是有时大多数属性甚至所有属性都必须为非空。并且标记每个属性并不优雅。
ef-code-first ×10
c# ×4
asp.net-mvc ×2
asp.net ×1
asp.net-core ×1
entity-framework-migrations ×1
foreign-keys ×1
migration ×1
mysql ×1
poco ×1
sql-server ×1