2017-02-08 95 views
0
public class Repository<TEntity> : IRepository<TEntity> where TEntity : Entity 
{ 
    private IDbSet<TEntity> GetSet() 
    { 
     return _unitOfWork.CreateSet<TEntity>(); 
    } 
} 

在上面的代碼引用類型正在逐漸上GETSET()錯誤 - 類型「TEntity」必須是爲了用它作爲參數

錯誤1類型「下面的錯誤TEntity'必須是引用類型,以便將其用作通用類型或方法'System.Data.Entity.IDbSet'中的參數'TEntity'E:\ Pradeep \ Workshop \ WebAPI \ Extras \ DDD \ DDD.WebAPI \ 4 .DDD.Infrastructure \ Repository \ Repository.cs 44 33 4.DDD.Infrastructure

+3

什麼是'Entity'?它是一個'結構'還是一個接口? – Sefe

回答

0

如果您將class添加到where語句中,那麼編譯器將知道它只能是引用類型。就像這樣:

public class Repository<TEntity> : IRepository<TEntity> where TEntity : Entity, class 
{ 
    // ... 
} 
+0

如果'Entity'是一個'struct',這將導致編譯器錯誤。 – Sefe

+1

@Sefe然後OP將10步更接近找出問題:) –

+1

@CallumLinington:是的,但可能不啓發。如果'Entity'是一個結構體,那麼使類的泛型變得沒有意義,因爲唯一有效的類型參數是'Entity'(這對於'structs'沒有繼承關係)。 – Sefe

1

在您Repository類,你對類型參數TEntity通用約束:

where TEntity : Entity 

在實體框架,實體必須是類(由where T : class約束強制執行)。既然你得到了錯誤,Entity不是一個類。唯一的可能性是它是一個struct或一個接口。根據是,您的問題解決方案是完全不同的:

  1. 如果Entitystruct,您需要將其更改爲class。 EF不會允許您創建具有值類型的實體集。
  2. 如果Entity是一個接口,您需要將引用類型約束轉發到您的存儲庫類(也許在您將它重命名爲IEntity以符合.NET編碼準則時)。

下面的代碼,如果Entity是一個接口:

public class Repository<TEntity> : IRepository<TEntity> where TEntity : class, Entity 
{ 
    //... 
} 
相關問題