biz*_*zon 4 c# entity-framework-4 ef-code-first asp.net-mvc-3
我有两节课:
public class Company
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<User> Users { get; set; }
}
public class User
{
public int Id { get; set; }
public string Email { get; set; }
public virtual ICollection<Company> Companies { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在我的MVC应用程序控制器中从post发布新公司.我想在这样的事情中添加当前用户到创建的公司.
User user = GetCurrentLoggedUser();
//company.Users = new ICollection<User>(); // Users is null :/
company.Users.Add(user); // NullReferenceException
companyRepository.InsertOrUpdate(company);
companyRepository.Save();
Run Code Online (Sandbox Code Playgroud)
它应该如何正常工作?我还不知道但是在将用户添加到集合之后,我预计将其保存到数据库会出现问题.任何有关它应该是什么样子的提示都将不胜感激.
使用这种方法:
public class Company
{
public int Id { get; set; }
public string Name { get; set;}
private ICollection<User> _users;
public ICollection<User> Users
{
get
{
return _users ?? (_users = new HashSet<User>());
}
set
{
_users = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
HashSet
为更好然后其他收藏品,如果你还覆盖Equals
和GetHashCode
你的实体.它将为您处理重复.懒惰的集合初始化也更好.我不记得它,但我认为我在我的第一个EF测试应用程序中遇到了一些问题,当我在构造函数中初始化集合时,还使用动态代理进行延迟加载和更改跟踪.
有两种类型的实体:分离和附加.上下文已跟踪附加实体.你通常从LINQ到实体查询或致电获取附加的实体Create
上DbSet
.上下文实体不会被上下文跟踪,但是一旦您调用Attach
或Add
在集合上附加此实体,所有相关实体也将被附加/添加.使用分离实体时,您必须处理的唯一问题是,如果相关实体已存在于数据库中,并且您只想创建新关系.
您必须了解的主要规则是添加和附加方法之间的区别:
Add
将所有分离的实体附加到图中Added
=>所有相关实体将作为新实体插入.Attach
将所有分离的实体附加到图表中Unchanged
=>您必须手动说出已修改的内容.您可以使用以下方法手动设置任何附加实体的状态:
context.Entry<TEntity>(entity).State = EntityState....;
Run Code Online (Sandbox Code Playgroud)
使用分离的多对多数时,通常必须使用这些技术来构建关系,而不是将重复实体插入数据库.
根据我自己的经验,使用分离的实体图非常困难,特别是在删除关系之后,因此我总是从数据库加载实体图并手动将更改合并到附加图中,这些图能够完全跟踪我的所有更改.
请注意,您不能混合来自不同上下文的实体.如果要将实体从一个上下文附加到另一个上下文,则必须首先将实体与第一个实体明确分离.我希望你可以通过Detached
在第一个上下文中设置它的状态来做到这一点.
归档时间: |
|
查看次数: |
7097 次 |
最近记录: |