我想将我的应用程序升级到EF 5,以利用对枚举空间等的支持等功能.但是,除非我转移到.Net 4.5,否则我无法升级.
我想知道.Net 4.5使用的是什么功能,它在.Net 4.0中无法完成?
我想[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.
使用数据库第一个模型:假设我们有经典的表Student,Course和StudentCourse(后者显然有FKS到Student和Course).
如果将此模型导入EF,您将获得为每个模型生成的对象.在Student和Course班将各自拥有的集合StudentCourses,从中你需要跳到另一个关系去的Course或Student分别.
我希望以这样的方式生成代码,使得底层交集表是不可见的,即Student具有集合Courses,并且Course具有集合Students.我已经在其他ORM软件(特别是TopLink)中看到了这一点.可以在EF中完成吗?
在我的模型中,我有一堆域对象.现在我在尝试更新用户对象时遇到问题.用户与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) 首先使用EF5数据库.在创建我的上下文中,我设置ContextOptions.LazyLoadingEnabled到true.有些事情发生了变化false(我们的代码中没有任何地方更改了设置).
在各个方面,我正在检查它是否仍然true使用这段代码(从实体对象获取上下文).该问题仅在运行多个线程时显示(加载一些实体,然后通过多线程代码传递它们).它不会出现在代码中的任何一致点上,因此无法确定究竟是什么导致它.
我想我只是希望有人可能对EF的内部运作有更多的了解并给我一些线索......
我有以下内容(为了清楚起见缩写) - 一个枚举,一个带有该枚举的基类,以及两个将枚举设置为特定值的派生类.
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) 我在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(我不认为它应该(?))而且对我来说它只是失去了使用导航属性的全部目的,如果我必须处理所有数据而不仅仅是属于我的农场的人.
所以,
谢谢你的阅读!
我之前没有使用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) 我遇到了这段代码的问题.我能够连接到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) 假设我想按国家/地区对客户数据库进行排名.在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)
这有两个问题:
System.NotSupportedException; 显然,没有SQL转换的重载.Select()使用行号; .ToList()为了能够调用这个方法,你必须将所有内容都拉入内存中; 和RANK()SQL中的函数那样处理相同的排名,即它们应该具有相同的排名,然后下面的项目跳到原始顺序.那我该怎么做呢?