我试图给我的实体框架更新方法提供一个属性列表,这些属性名应该标记为未更改。但是它确实获取了属性,但是在尝试更改状态时它会产生以下错误:
实体类型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; }
}
我猜测问题是该帐户是作为单独的对象参数传递的,所以它不再在上下文中?这样做的好方法是什么?
答案 0 :(得分:0)
好的,所以我现在通过从地址实体中删除帐户外键来解决问题,因为该关系也在帐户实体上描述。虽然现在确实有效,但我还是不完全理解为什么当外键出现在实体上时它没有。如果有人知道答案我仍然想知道。