【问题标题】:Entity Framework - Duplicate parent(one) when create new child(many)实体框架 - 创建新子项时重复父项(一个)(很多)
【发布时间】:2013-03-09 20:39:54
【问题描述】:

因为我的英文不好,我就直接开门见山了。 为什么在数据库中记录公司创建新记录而客户记录引用新公司记录? 感谢您的帮助:)

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 { return (BenzineFleetContext) UnitOfWork; }
    }

    public virtual DbSet<TEntity> GetDbSet<TEntity>() where TEntity : class
    {
        return Context.Set<TEntity>();
    }

    public virtual void Add(TEntity entity)
    {
        GetDbSet<TEntity>().Add(entity);
    }

    public virtual void SaveChanges()
    {
        Context.SaveChanges();
    }
}

    //Save

var cus = 新客户 {Company = SelectedCompany}

    _srv.Add(cus);
    _srv.SaveChanges();

【问题讨论】:

  • 有一些关系和其他的东西,可能……你能清楚地说明你到底想做什么吗?
  • 我想从数据库中创建新客户 customer.Company = SelectedCompany

标签: entity-framework


【解决方案1】:

当您通过DbSet&lt;T&gt;.Add 方法添加实体时,实体及其引用的所有尚未在上下文中的实体将在ChangeTracker 中标记为Added。这就是添加新公司的原因(看起来公司与上下文无关):

var customer = new Customer {Company = SelectedCompany}
context.Customers.Add(customer);
// at this point customer state will be Added
// company state also will be Added
context.SaveChanges();

为避免此类行为,请在添加新客户之前将公司附加到上下文中:

var customer = new Customer {Company = SelectedCompany}
context.Companies.Attach(SelectedCompany);
context.Customers.Add(customer);
// at this point customer state will be Added
// company state will be Unchanged (if you haven't change it)
context.SaveChanges();

另一种方法是手动维护状态:

var customer = new Customer {Company = SelectedCompany}
context.Customers.Add(customer);
context.Entry(SelectedCompany).State = EntityState.Unchanged;
// at this point customer state will be Added
// company state will be Unchanged
context.SaveChanges();

【讨论】:

  • 但在其他方法中,我添加卡引用客户与添加客户引用公司相同,它不会创建重复记录。
  • @yovierayz 在这种情况下看起来记录在上下文中
  • 原来问题出在添加公司列表中,我创建了两次公司列表的新对象。但是顺便说一句,感谢您的帮助,我将应用您的示例来改进我的代码:)
【解决方案2】:

您可以在实体框架中看到所有基本 CRUD(创建读取更新删除) 操作的 thisthis。这对你会很有帮助。还可以简要了解外键基础和一对多关系。

【讨论】:

    猜你喜欢
    • 2014-08-18
    • 1970-01-01
    • 2021-02-19
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多