按字符串更改属性的状态

时间:2015-12-29 11:30:56

标签: c# entity-framework

我试图给我的实体框架更新方法提供一个属性列表,这些属性名应该标记为未更改。但是它确实获取了属性,但是在尝试更改状态时它会产生以下错误:

  

实体类型RuntimePropertyInfo不是当前上下文的模型的一部分。

哪个有意义但有没有办法获取当前上下文中的对象属性?

这是我的代码:

if (propertiesToSkip != null)
        {
            foreach (var propertyName in propertiesToSkip)
            {
                var prop = entity.GetType().GetProperty(propertyName);
                _context.Entry(prop).State = EntityState.Unchanged;
            }
        }

我希望任何人都可以提供帮助。

修改

public static void MigrateIqrAccountDetails(ref IUnitOfWork uow, Account account,
        IEnumerable<List<string>> iqrContacts)
    {
        if (account.IqrAccount == null) throw new ArgumentException("Cannot migrate Account");

        // Addresses
        var addresses = ContactMigrationHelper.MigrateIqrContactAddresses(contact);
        if (addresses != null)
            account.Addresses.AddRange(addresses.Except(account.Addresses, new Comparers.AddressComparer()));
        uow.Repository<IqrAccount>().Update(account.IqrAccount);
        uow.Repository<Account>().Update(account, new List<string> {"Name"});
    }

这是编辑对象的方法,应该在上下文中更新它。

正在收集帐户:

var accountToUpdate =
            uow.Repository<Account>()
                .GetAll(a => a.IqrAccount != null, "PhoneNumbers", "EmailAddresses", "Addresses")
                .OrderBy(a => a.IqrAccount.UpdatedAt)
                .FirstOrDefault();

在看起来像这样的存储库中:

public IEnumerable<T> GetAll(Func<T, bool> predicate = null, params string[] includes)
    {
        var query = Include(_objectSet, includes);
        return predicate != null ? query.Where(predicate).Where(o => !o.IsRemoved) : query.Where(o => !o.IsRemoved);
    }

protected virtual IQueryable<T> Include(IQueryable<T> query, params string[] includes)
    {
        if (includes == null) return query;

        query = includes.Aggregate(query, (current, item) => current.Include(item));
        return query;
    }

错误即时获取:

  

INSERT语句与FOREIGN KEY约束“FK_dbo.Addresses_dbo.Accounts_AccountId”冲突。冲突发生在数据库“Test”,表“dbo.Accounts”,列“Id”中。   声明已经终止。

调用savechanges时。

这也是我的模特:

    public class Account : BaseEntity
{
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }

    public virtual List<Address> Addresses { get; set; }

    public int? CommentCollectionId { get; set; }

    public virtual LabelCollection LabelCollection { get; set; }

    public virtual User AccountManager { get; set; }

    [ForeignKey("ParentAccount")]
    public virtual int? ParentAccountId { get; set; }
    public virtual Account ParentAccount { get; set; }
    public virtual ICollection<Account> SubAccounts { get; set; } 
}


public class Address : BaseEntity
{
    public int Id { get; set; }
    public string Country { get; set; }
    public string Region { get; set; }
    public string City { get; set; }
    public string Street { get; set; }
    public string Number { get; set; }
    public string NumberExtension { get; set; }
    public string ZipCode { get; set; }
    public bool IsActive { get; set; }
    public string Premise { get; set; }
    public string SubPremise { get; set; }
    public Location Coordinates { get; set; }

    [ForeignKey("Account")]
    public int AccountId { get; set; }
    public Account Account { get; set; }

}

我猜测问题是该帐户是作为单独的对象参数传递的,所以它不再在上下文中?这样做的好方法是什么?

1 个答案:

答案 0 :(得分:0)

好的,所以我现在通过从地址实体中删除帐户外键来解决问题,因为该关系也在帐户实体上描述。虽然现在确实有效,但我还是不完全理解为什么当外键出现在实体上时它没有。如果有人知道答案我仍然想知道。