标签: entity-framework-5

是否有技术原因在.NET4.0上不完全支持EF 5?

我想将我的应用程序升级到EF 5,以利用对枚举空间等的支持等功能.但是,除非我转移到.Net 4.5,否则我无法升级.

我想知道.Net 4.5使用的是什么功能,它在.Net 4.0中无法完成?

.net .net-4.5 entity-framework-5

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

可选实体框架复杂类型的必需属性

我想[Required]在Entity Framework中的复杂类型上定义属性.例如,我有一个Customer可选的实体Address.Address实体具有必需PostCode属性.

[ComplexType]
public class Address {
    public string Address1 { get; set; }
    [Required]
    public string PostCode { get; set; }
}

public class Customer {
    public int CustomerId {get;set;}
    public Address Address {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

我不想将我的Complex类型存储为一个单独的实体(我实际上并没有使用Address,这只是一个简单的问题说明).我不能将Customer.Address留空,因为这会给出错误:

非可空成员的空值.成员:'地址'.

如果我提供一个空的Address实体,由于Required属性,验证在PostCode字段上失败.

有没有办法实现这个目标?我正在使用EF5/NET4.5.

entity-framework entity-framework-5

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

实体框架可以在没有交集对象的情况下处理多对多关系吗?

使用数据库第一个模型:假设我们有经典的表Student,CourseStudentCourse(后者显然有FKS到StudentCourse).

如果将此模型导入EF,您将获得为每个模型生成的对象.在StudentCourse班将各自拥有的集合StudentCourses,从中你需要跳到另一个关系去的CourseStudent分别.

我希望以这样的方式生成代码,使得底层交集表是不可见的,即Student具有集合Courses,并且Course具有集合Students.我已经在其他ORM软件(特别是TopLink)中看到了这一点.可以在EF中完成吗?

c# entity-framework ef-database-first entity-framework-5

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

EF 5,更新对象给出"发生参照完整性约束违规"

在我的模型中,我有一堆域对象.现在我在尝试更新用户对象时遇到问题.用户与Role对象具有外键关系.当我更新User-object而不更改foreignkey值(FkRoleId)时,一切正常.但是,当我更改当前用户的角色时,我想要更新,我得到错误:

发生了引用完整性约束违规:定义引用约束的属性值在关系中的主体和从属对象之间不一致.

以下是我更新用户对象的方法:

public void Update(User user)
{
    using (var context = new DBEntities())
    { 
    context.Entry(user).State = System.Data.EntityState.Modified;
    context.SaveChanges();
    }
}
Run Code Online (Sandbox Code Playgroud)

如何更新我的用户对象而不会出现此异常?必须有一种方法来修改foreignkey值,以便将用户mappen到另一个角色.

在这种情况下,这是我的域类:

public partial class User
{
public User()
{
    this.Advertisers = new HashSet<Advertiser>();
    this.Cases = new HashSet<Case>();
    this.Materials = new HashSet<Material>();
}

public int PkId { get; set; }
public int FkRoleId { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc-4 entity-framework-5

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

什么在我的EF上下文中将LazyLoadingEnabled设置为false?

首先使用EF5数据库.在创建我的上下文中,我设置ContextOptions.LazyLoadingEnabledtrue.有些事情发生了变化false(我们的代码中没有任何地方更改了设置).

在各个方面,我正在检查它是否仍然true使用这段代码(从实体对象获取上下文).该问题仅在运行多个线程时显示(加载一些实体,然后通过多线程代码传递它们).它不会出现在代码中的任何一致点上,因此无法确定究竟是什么导致它.

我想我只是希望有人可能对EF的内部运作有更多的了解并给我一些线索......

entity-framework entity-framework-5

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

实体框架5 - 基于枚举的派生类的判别器

我有以下内容(为了清楚起见缩写) - 一个枚举,一个带有该枚举的基类,以及两个将枚举设置为特定值的派生类.

public enum MyEnum
{ 
    Value1, Value2
}

public class MyBaseClass
{ 
    public MyEnum { get; protected set; }
}

public class DerivedOne: MyBaseClass
{
    public DerivedOne { MyEnum = MyEnum.Value1; } 
}

public class DerivedTwo: MyBaseClass
{
    public DerivedTwo { MyEnum = MyEnum.Value2; }
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是让Entity Framework 5自动区分DerivedOne和DerivedTwo,并使用基于MyEnum值的鉴别器.我应该能够这样做,按照惯例,每个MyEnum == MyEnum.Value1代表DerivedOne,而MyEnum == MyEnum.Value2代表DerivedTwo.

我在我的DbContext中试过这个:

public class MyDbContext : DbContext
{
    DbSet<MyBaseClass> MyBaseClass { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<MyBaseClass>()
                    .Map<DerivedOne>(m => m.Requires(x …
Run Code Online (Sandbox Code Playgroud)

c# .net-4.0 ef-code-first entity-framework-5

10
推荐指数
2
解决办法
4686
查看次数

在EF Code First中过滤导航属性

我在EF中使用Code First.假设我有两个实体:

public class Farm
{
    ....
    public virtual ICollection<Fruit> Fruits {get; set;}
}

public class Fruit
{
    ...

}
Run Code Online (Sandbox Code Playgroud)

我的DbContext是这样的:

public class MyDbContext : DbSet
{
    ....
    private DbSet<Farm> FarmSet{get; set;} 

    public IQueryable<Farm> Farms
    {
        get
        {
            return (from farm in FarmSet where farm.owner == myowner select farm);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我这样做,以便每个用户只能看到他的农场,我不必调用每个查询的位置到数据库.

现在,我想过滤掉一个农场的所有水果,我试过这个(在Farm类中):

from fruit in Fruits where fruit .... select fruit
Run Code Online (Sandbox Code Playgroud)

但是生成的查询不包含where子句,这非常重要,因为我有几十万行,加载它们并在它们是对象时过滤它们效率不高.

我读到延迟加载的属性在第一次被访问时被填充,但是他们读取了所有数据,没有过滤器可以应用,除非你做这样的事情:

from fruits in db.Fruits where fruit .... select fruit
Run Code Online (Sandbox Code Playgroud)

但我不能这样做,因为Farm不知道DbContext(我不认为它应该(?))而且对我来说它只是失去了使用导航属性的全部目的,如果我必须处理所有数据而不仅仅是属于我的农场的人.

所以,

  1. 我做错什么/做出错误的假设?
  2. 有没有什么办法可以将过滤器应用到为真实查询生成的导航属性?(我正在处理大量数据)

谢谢你的阅读!

.net c# entity-framework code-first entity-framework-5

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

是否可以创建一个将项添加到实体框架dbset的通用方法?

我之前没有使用Entity Framework或泛型,并且在减少代码方面遇到了一些困难.

我正在解析一个文本文件来加载10个查找表,其中的数据可能会在每晚更改.文本文件具有"类型"的标题,后跟键/值集的列表.我有这个完美的工作,但我想重构代码来清理它,并希望使用泛型方法来实现这一点,所以我可以减少重复的代码.

我已经解析为泛型方法,但我无法弄清楚如何以通用方式将实体添加到上下文中.我必须遍历每种类型的实体列表并将它们添加到上下文中:

void Main()
{
    switch (line.ToUpper())
    {
        case "AREA":
        {
            List<Area> areaList = this.GetItems<Area>(file);

            foreach (var element in areaList)
            {
                if (context.Area.Find(element.Id) == null)
                {
                    context.Area.Add(element);
                }
            }

            break;
        }
        case "CATEGORY":
        {
            List<Category> categoryList = this.GetItems<Category>(file);

            foreach (var element in categoryList)
            {
                if (context.Category.Find(element.Id) == null)
                {
                    context.Category.Add(element);
                }
            }

            break;
        }
    }
}

private List<T> GetItems<T>(StreamReader reader) where T : ILookupData, new()
{
    string line;
    List<T> list = new List<T>();            

    while (reader.Peek() == ' ') …
Run Code Online (Sandbox Code Playgroud)

c# generics entity-framework entity-framework-5

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

实体框架Context.SaveChanges根本不起作用

我遇到了这段代码的问题.我能够连接到mdf示例数据库存档并生成实体模型.当我尝试在上下文中更新,删除或插入任何内容并将更改转换为DB Context.SaveChanges时,我能够查询上下文模型并从数据库中检索信息.没有异常,实体模型已正确更新,但数据库没有更改.谢谢你

public void addCourse(int courseId, int deptId, string courseTitle)
{    
SchoolContexto = new SchoolEntities();            

Course mycourse= new Course();
mycourse.CourseID = courseId;
mycourse.Credits = 10;
mycourse.DepartmentID = deptId;
mycourse.Title = courseTitle;
SchoolContexto.Courses.Add(mycourse);            

SchoolContexto.SaveChanges();
SchoolContexto.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

c# entity-framework-5 visual-studio-2012

10
推荐指数
2
解决办法
2万
查看次数

Entity Framework中是否有一个函数转换为SQL中的RANK()函数?

假设我想按国家/地区对客户数据库进行排名.在SQL中我会写:

select CountryID, CustomerCount = count(*), 
       [Rank] = RANK() over (order by count(*) desc)
from Customer
Run Code Online (Sandbox Code Playgroud)

现在我想在Entity Framework中写这个:

var ranks = db.Customers
  .GroupBy(c => c.CountryID)
  .OrderByDescending(g => g.Count())
  .Select((g, index) => new {CountryID = g.Key, CustomerCount = g.Count, Rank = index+1});
Run Code Online (Sandbox Code Playgroud)

这有两个问题:

  1. 它不起作用.EF抛出一个System.NotSupportedException; 显然,没有SQL转换的重载.Select()使用行号; .ToList()为了能够调用这个方法,你必须将所有内容都拉入内存中; 和
  2. 即使您在本地内存中运行该方法,它也不像RANK()SQL中的函数那样处理相同的排名,即它们应该具有相同的排名,然后下面的项目跳到原始顺序.

那我该怎么做呢?

c# sql-server-2012 entity-framework-5

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