标签: code-first

实体框架代码优先 - 渴望加载不按预期工作?

我有以下Entity Framework POCO类:

public class Customer
{
    public int Id {get;set;}
    public string Name {get;set;}

    public virtual ICollection<Order> Orders {get;set;}
}

public class Order
{
    public int Id {get;set;} 
    public int CustomerId {get;set;}
    public int OrderTypeId {get;set;}

    public virtual OrderType Type {get;set;}
    public virtual Customer Customer {get;set;}
} 

public class OrderType 
{
    public int Id {get;set;}
    public virtual ICollection<Order> Orders {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

问题是,当我返回我的时候,我ICollection<Order>Orders正常,但是它的OrderType属性Order没有被填充.我的订单将包含以下详细信息:

Id:          1
CustomerId:  1
Customer:    Populated
OrderTypeId: 3
Type: …
Run Code Online (Sandbox Code Playgroud)

linq-to-entities code-first entity-framework-4 c#-4.0

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

实体框架代码首先开发资源和文档

我知道EF4仍在开发中,但作为该主题的新手,我需要一个文档,教程等EF 4代码第一种方法.所有信息都在EF 4团队博客中,但分散在不同的帖子中.全面覆盖将是非常好的.

谁知道这样的地方?

code-first entity-framework-4

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

实体框架CTP5,代码优先.有多个级联删除

我有两个实体(Customer和CustomerRole),并希望声明它们之间的多对多关系.我可以使用以下代码:

modelBuilder.Entity<CustomerRole>()
        .HasMany(cr => cr.Customers) 
        .WithMany(c => c.CustomerRoles)
        .Map(m => m.ToTable("Customer_CustomerRole_Mapping"));
Run Code Online (Sandbox Code Playgroud)

但它创建了关系(和第三个映射表),默认情况下关闭级联删除.如何在使用多对多时告诉EF创建与级联删除关系的关系?

asp.net code-first entity-framework-4

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

EF Code First:IValidatable Object未验证

我在一个简单的测试场景中有一个对象,它使用EF Code First并实现IValidatableObject.有一些非常简单的逻辑可以添加验证错误并将其返回.对象上还有其他验证.

但是,在保存对象时 - 基于属性的验证工作 - IValidatableObject接口似乎永远不会触发.调试器不会进入它,并且调用SaveChanges()或GetValidationErrors()时错误永远不会出现.

public class Customer : IValidatableObject {
[Key]
public int Id { get; set; }

[StringLength(50)]
[DisplayName("First Name")]

public string FirstName { get; set; }

[Required]
[DisplayName("Last Name")]
[StringLength(50)]
public string LastName { get; set; }

[Required]
[StringLength(100)]
public string Company { get; set; }

[StringLength(200)]
public string Email { get; set; }

[DisplayName("Credit Limit")]
public decimal CreditLimit { get; set; }

[DisplayName("Entered On")]
public DateTime? Entered { get; set; }


public virtual …
Run Code Online (Sandbox Code Playgroud)

entity-framework code-first

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

在Entity Framework 4.1 Code First中创建双向一对一关系

我想使用EF Code First在两个实体之间创建双向一对一关系.我遇到以下代码的问题.你觉得我应该怎么做?

public class User
{
    public string ID { get; set; }
    public string LastName { get; set; }
    public string Password { get; set; }
    public string FirstName { get; set; }

    public int ProfileID { get; set; }
    public Profile Profile { get; set; }

}
public class Profile
{
    public int UserID { get; set; }
    public User User { get; set; }
    public int ProfileID { get; set; }
    public string ProfileName { get; …
Run Code Online (Sandbox Code Playgroud)

code-first relationships entity-framework-4.1

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

实体框架启动时间

我想知道是否有可能加快首先使用EF代码进行的第一次查询.

我做了一个小测试程序,其中一个实体包含2个字段,第一个查询需要2.2秒,第二个查询(完全相同)需要0.006秒.

我已经预编译了视图,所以在这里不会有帮助.我认为问题是在内存中构建模型需要一些时间,但是它需要花费那么长时间吗?有没有一种方法来预编译这个模型,就像有视图一样?

performance entity-framework startup precompiled code-first

11
推荐指数
2
解决办法
4222
查看次数

没有子导航属性的EF一对多外键

使用代码优先的实体框架和.NET 4,我试图在父母与子女之间建立一对多的关系:

public class Parent
{
    [Key]
    public int ParentId { get; set; }
    [Required]
    public string ParentName { get; set; }
    public IEnumerable<Child> Children { get; set; }
}

public class Child
{
    [Key]
    public int ChildId { get;  set; }
    [ForeignKey]
    public int ParentId { get; set; }
    [Required]
    public string ChildName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

正如这里所指出的,为了将外键关系带入数据库,必须链接实际对象,而不仅仅是它们的ID.如果子项包含对其父项的引用(示例),则执行此操作的常规方法.

但是,如何在我的实现中强制执行外键,这是另一种方式(父引用子代)?

c# entity-framework foreign-keys code-first

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

如何更新在DbContext之外修改的实体?

如果实体在DbContext之外被更改(是一个分离的实体),我在更新实体方面遇到了一个小问题.如果我附加修改后的实体,则其状态不会被修改.

我的代码看起来像这样:

var specificationToSave = GetSpecificationFromTmpStore(userSessionGuid);
using (var context = DataContextFactory.GetDataContext())
{
    // this works for update, if I change the values inside the context while debugging
    // but it breaks with new entities
    context.Specifications.Attach(specificationToSave);

    // this works for insert new entities, modified entities will be saved as new entities
    context.Specifications.Add((specificationToSave);)
    context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

我知道NHibernate,它的方法是SaveOrUpdate.如果更新或插入实体,NHibernate会因为值而决定.

使用EF 4.x以及在DbContext之外修改的实体执行此操作的最佳做​​法是什么?如何告诉EF该实体处于修改状态?

c# entity-framework code-first entity-framework-4

11
推荐指数
1
解决办法
3万
查看次数

覆盖Entity Framework 5 Code Code中的SaveChanges以复制旧旧库的行为

我们公司提供一套操作数据库中数据的各种应用程序.每个应用程序都有其特定的业务逻辑,但所有应用程序共享业务规则的公共子集.常见的东西包含在一堆用C++编写的遗留COM DLL中,它们使用"经典ADO"(它们通常调用存储过程,有时它们使用动态SQL).这些DLL中的大多数都具有基于XML的方法(更不用说基于专有格式的方法!)来创建,编辑,删除和检索对象,还有额外的操作,例如快速复制和转换许多实体的方法.

中间件DLL现在已经很老了,我们的应用程序开发人员需要一个新的面向对象(不是面向xml)的中间件,可以很容易地被C#应用程序使用.该公司的许多人都说我们应该忘记旧的范例,转而采用新的酷炫的东西,比如Entity Framework.他们对POCO的简单性很感兴趣,他们希望使用LINQ来检索数据(基于Xml的DLL查询方法不是那么容易使用,并且永远不会像LINQ那样灵活).

所以我正在尝试为简化场景创建一个模型(真实场景要复杂得多,在这里我只发布一个简化场景的简化子集!).我正在使用Visual Studio 2010,实体框架5代码优先,SQL Server 2008 R2.如果我犯了愚蠢的错误,请怜悯,我是Entity Framework的新手.由于我有许多不同的疑虑,我会将它们分别发布.这是第一个.传统的XML方法有这样的签名:

    bool Edit(string xmlstring, out string errorMessage)
Run Code Online (Sandbox Code Playgroud)

使用这样的格式:

<ORDER>
    <ID>234</ID>
    <NAME>SuperFastCar</NAME>
    <QUANTITY>3</QUANTITY>
    <LABEL>abc</LABEL>
</ORDER>
Run Code Online (Sandbox Code Playgroud)

Edit方法实现了以下业务逻辑:当Quantity更改时,必须对具有相同Label的所有Orders应用"自动缩放".例如,有三个订单:OrderA的数量= 3,标签= X.订单B的数量= 4,标签= X.订单C的数量= 5,标签= Y.我调用Edit方法为OrderA提供新的数量= 6,即我将OrderA的数量加倍.然后,根据业务逻辑,OrderB的数量必须自动加倍,并且必须变为8,因为OrderB和OrderA具有相同的标签.不得更改OrderC,因为它具有不同的标签.

我如何使用POCO类和实体框架复制它?这是一个问题,因为旧的Edit方法一次只能更改一个订单,而实体框架可以在调用SaveChanges时更改大量订单.此外,对SaveChanges的单次调用也可以创建新的订单.临时假设,仅适用于此测试:1)如果同时更改了许多订单数量,并且所有这些订单数量的比例因子都不相同,则不进行缩放; 2)新添加的订单即使具有相同的缩放订单标签也不会自动缩放.

我试图通过重写SaveChanges来实现它.

POCO课程:

using System;

namespace MockOrders
{
    public class Order
    {
        public Int64 Id { get; set; }
        public string Name { get; set; }
        public string Label { get; set; }
        public decimal Quantity { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

迁移文件(创建索引):

namespace MockOrders.Migrations
{
    using …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework savechanges code-first entity-framework-5

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

Database.SqlQuery调用具有多个输出参数的存储过程

我有一个像下面的存储过程,它接受1个输入参数(Name)并返回2个输出参数(EmployeeId和Salary).我们的存储过程会将Name插入Employee表并返回EmployeeId和Salary.

CREATE PROCEDURE dbo.insertemployee
@iName varchar(500),
@OEmployeeId int OUTPUT,  
@OSalary Money OUTPUT
Run Code Online (Sandbox Code Playgroud)

我们正在使用EF Code First方法.我能够将记录插入到employee表中,但无法找到如何访问我的两个输出参数.我知道我需要使用如下.任何人都可以告诉我一定是什么结果.根据MSDN,它可以是一个具有列名作为属性的类.但我的情况是我们没有返回我的表的列,但我们使用两个输出参数,我需要知道如何访问这两个输出参数@OEmployeeId和@OSalary.

context.Database.SqlQuery<Result>(" exec dbo.insertemployee....);

public class Result
{
   // what properties I must give here       
}
Run Code Online (Sandbox Code Playgroud)

entity-framework code-first

11
推荐指数
1
解决办法
3万
查看次数