标签: ef-code-first

每次访问导航属性时都会读取它们吗?(EF4.1)

我正在使用 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...)等过滤该集合呢?它是否也加载整个图形,或者仅加载最终数据?

entity-framework poco ef-code-first entity-framework-4.1

1
推荐指数
1
解决办法
972
查看次数

如果为 NULL,则分配默认值

我有一个 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 吗?

asp.net-mvc ef-code-first

1
推荐指数
1
解决办法
2612
查看次数

实体框架 - 删除带有外键的对象,保留父对象

我有以下型号:

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)

c# entity-framework ef-code-first

1
推荐指数
1
解决办法
9335
查看次数

在实体优先迁移中为新 Guid 列添加默认值

我正在为我的项目使用实体代码首次迁移。我已经启动并运行了系统。但是,我需要添加一个新的 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 作为默认值?

migration asp.net-mvc ef-code-first

1
推荐指数
2
解决办法
3517
查看次数

如何在 ASP.NET 实体框架中设置删除级联以实现自引用外键

我正在开发一个 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

1
推荐指数
1
解决办法
2138
查看次数

使用实体框架代码优先的 C# 模型用户、好友请求和好友

我之前曾在这里问过一个关于类似主题的问题,但后来采取了不同的方法。这是我的模型:

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)

c# entity-framework ef-code-first entity-framework-6

1
推荐指数
1
解决办法
3206
查看次数

实体框架mysql - 创建函数时出错

我正在尝试使用实体框架迁移在 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 (...

mysql entity-framework ef-code-first

1
推荐指数
1
解决办法
576
查看次数

实体框架 6.0 一对多关系不起作用

我尝试使用实体框架与代码优先和流畅的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)

c# entity-framework ef-code-first

1
推荐指数
1
解决办法
4039
查看次数

强制实体框架6(EF6)使用nvarchar(MAX)

我以为这很容易,但是...

您如何强制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

sql-server entity-framework ef-code-first

1
推荐指数
1
解决办法
2812
查看次数

首先是实体框架代码中所有属性的必需规则

我首先使用代码和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)

关键是有时大多数属性甚至所有属性都必须为非空。并且标记每个属性并不优雅。

c# entity-framework ef-code-first asp.net-core

1
推荐指数
1
解决办法
620
查看次数