【问题标题】:Entity Framework: Generic compare type without Id?实体框架:没有 Id 的通用比较类型?
【发布时间】:2012-01-20 22:45:39
【问题描述】:

无论如何,在没有 ID 的对象的情况下,是否可以在对象之间进行一般性比较是否相等?

我正在尝试做一个典型的通用更新,为此我在网上看到了很多例子,但它们通常看起来像这样:

public void Update(TClass entity)
{
    TClass oldEntity = _context.Set<TClass>().Find(entity.Id);
    foreach (var prop in typeof(TClass).GetProperties())
    {
        prop.SetValue(oldEntity, prop.GetValue(entity, null), null);
    }
}

或类似的东西。我的系统的问题是,并非每个类都有一个名为 Id 的属性,具体取决于 Id 可以是 ClassnameId 的类。那么我是否可以通过 LINQ 检查是否存在并返回这样的实体而不提供任何一般属性?

【问题讨论】:

    标签: entity-framework generics equality


    【解决方案1】:

    试试

    public void Update(TClass entity)
    {
        var oldEntry = _context.Entry<TClass>(oldEntity);
    
        if (oldEntry.State == EntityState.Detached)
        {
             _context.Set<TClass>().Attach(oldEntity);
        }
    
        oldEntry.CurrentValues.SetValues(entity);
        oldEntry.State = EntityState.Modified;
    }
    

    【讨论】:

    • 谢谢,从我读到的更新值只更新复杂和标量属性,但不更新导航属性?那么这是否意味着如果我有一个用户拥有一组组并删除一个组并更新,那么该更改将不适用于 CurrentValues.SetValues?还是仅仅意味着我无法通过用户对象上的此方法更改和更新实际的组对象? stackoverflow.com/questions/6974660/…。您的代码中是否还有拼写错误?似乎Entry应该将实体作为参数,如果我只是从db中获取它,它是否分离?
    • @DOTang 你对导航属性是正确的。通用更新方法不适用于所有情况。我没有编译上面的代码。所以可能有错别字
    • @Erange 谢谢 Eranga,但您能否澄清一下这意味着什么,如果我有一个带有 ICollection 组的用户对象。这是否意味着a)如果我从特定用户的该集合中删除组并更新用户,则不会保存删除的组更改,或者b)这意味着如果我尝试更改实际的组对象(比如我更改name 属性)从集合中,并更新用户,组对象更改不会被保存?
    • ...在之前的评论中输入了您的姓名。
    猜你喜欢
    • 1970-01-01
    • 2018-05-14
    • 2014-08-21
    • 2012-10-04
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 2012-09-23
    • 2021-10-24
    相关资源
    最近更新 更多