我今天遇到了一个有趣的问题。我在大多数项目中都使用了通用存储库,例如:
public interface IGenericRepository<T> where T : class
{
IEnumerable<T> CokGetir(Expression<Func<T, bool>> predicate);
T Getir(Expression<Func<T, bool>> predicate);
void Ekle(T entity);
void Duzenle(T entity);
void Sil(T entity);
}
CokGetir在哪里:
public IEnumerable<T> CokGetir(Expression<Func<T, bool>> predicate)
{
if (predicate != null)
{
return _objectSet.Where(predicate);
}
return _objectSet.AsEnumerable();
}
在代码中清楚,此方法返回LINQ中询问的对象列表。
我在此项目中使用SignalR并连接到SQL数据库以存储用户消息和详细信息。当我调用CokGetir方法来获取以下频道中的最新用户时:
var kullanicilar = _uow.Depo<ChatUserDetails>().CokGetir(p => p.YayinId.Equals(yayinId)).ToList();
kullanicilar变量包含2个不同的对象(因为有2个用户连接)。一个是数据对象&#39; Veri.ChatUserDetails&#39;另一个是&#39; {System.Data.Entity.DynamicProxies.ChatUserDetails_CF31378E4F985AB5B3AD99CDFCE21159AF26DDCA5BFBBB19F31B31537C3DEBA0}&#39;如图所示:
我需要动态对象(两者),因为它保存与其他表的关系;另一方面,Veri.ChatUserDetails
没有它们。什么可能导致这种混乱?我不想在使用此动态存储库时使用普通dbContext
,那么我该如何克服这种情况呢?
修改
ChatUserDetails
根据要求:
public partial class ChatUserDetails
{
public int ID { get; set; }
public string ConnectionId { get; set; }
public string KullaniciId { get; set; }
public int YayinId { get; set; }
public virtual AspNetUsers AspNetUsers { get; set; }
public virtual YAY_Yayinlar YAY_Yayinlar { get; set; }
}
编辑2:
这是第二次编辑,其中包含有关该主题的更多信息。如果用户第一次连接到集线器,则不会发生此问题。但是,当用户刷新网页时, SignalR 会重新分配用户的ConnectionId
并将其重新注册到聊天频道。此时,kullanicilar
个对象中的一个丢失了与表的所有关系。
此外,正如我所观察到的,在新用户连接时,第一次运行时kullanicilar
有2个不同的对象(数据和动态对象),并且它们都与其他表有关系。如上所述,当用户刷新页面时,它会丢失关系
我真的很困惑。