我最近一直在使用Entity Framework 4,并且稍微混淆了何时使用ObjectSet.Attach和ObjectSet.AddObject.
根据我的理解:
所以,如果我正在创建一个新人,我会这样做.
var ctx = new MyEntities();
var newPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.AddObject(newPerson);
ctx.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
如果我正在修改现有的人,我这样做:
var ctx = new MyEntities();
var existingPerson = ctx.Persons.SingleOrDefault(p => p.Name = "Joe Bloggs" };
existingPerson.Name = "Joe Briggs";
ctx.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
请记住,这是一个非常简单的例子.实际上我使用的是Pure POCO(无代码生成),Repository模式(不处理ctx.Persons)和Unit of Work(不处理ctx.SaveChanges).但是"在幕后",以上是我的实施中发生的事情.
现在,我的问题 - 我还没有找到一个我不得不使用Attach的场景.
我在这里失踪了什么?我们什么时候需要使用Attach?
编辑
只是为了澄清,我正在寻找何时使用Attach over AddObject(或反之亦然)的示例.
编辑2
下面的答案是正确的(我接受了),但我认为我会添加另一个例子,其中Attach将是有用的.
在我上面修改现有Person的示例中,实际上正在执行两个查询.
一个用于检索Person(.SingleOrDefault),另一个用于执行UPDATE(.SaveChanges).
如果(出于某种原因),我已经知道系统中存在"Joe Bloggs",为什么还需要额外的查询才能获得他的第一个?我能做到这一点: …
因为我的英语不好,我直截了当.为何记录公司在数据库中创建新记录和客户记录是否参考新公司记录?感谢帮助 :)
public class Company : EntityBase
{
public string Name { get; set; }
public List<Customer> Customers { get; set; }
public List<Invoice> Invoices { get; set; }
}
public class Customer : EntityBase
{
public string Name { get; set; }
public Company Company { get; set; }
public List<Card> Cards { get; set; }
}
public class EFRepositoryBase<TEntity> where TEntity : class, IEntity, new()
{
protected IUnitOfWork UnitOfWork { get; set; }
protected BenzineFleetContext Context
{
get …Run Code Online (Sandbox Code Playgroud) 我首先使用EF代码开发我的3层WinForm应用程序,我使用了断开连接的POCOs作为我的模型实体.我的所有实体都是从BaseEntity类继承的.
我使用了断开连接的POCOs,所以我State在客户端处理实体,并且在ApplyChanges()方法中,我将我的实体图(例如An Orderwith it's OrderLinesand Products)附加到我DbContext,然后将每个实体State与它的客户端同步State.
public class BaseEntity
{
int _dataBaseId = -1;
public virtual int DataBaseId // DataBaseId override in each entity to return it's key
{
get { return _dataBaseId; }
}
public States State { get; set; }
public enum States
{
Unchanged,
Added,
Modified,
Deleted
}
}
Run Code Online (Sandbox Code Playgroud)
所以,当我想保存相关实体的图形时,我使用了以下方法:
public static EntityState ConvertState(BaseEntity.States state)
{
switch (state) …Run Code Online (Sandbox Code Playgroud)