2014-11-24 73 views
0

有沒有辦法編寫基礎實體,其中主鍵的類型未使用泛型指定?實體框架 - 如何創建沒有泛型的基礎實體

舉例來說,我一直到目前爲止,這樣做:

public class BaseUniqueEntity<T> where T : IComparable, IComparable<T> { 
    [Key] 
    public T Key{ get; set; } 
} 

這是很好的,但現在是給我的設計問題。例如,編碼的通用倉庫時,我obligued指定兩個類型的約束:

public interface IRepository<K, E> 
    where K : IComparable, IComparable<K> 
    where E : BaseUniqueEntity<K> 

我只希望指定實體的類型E,但我需要的K類型指定where E : BaseUniqueEntity<K>約束。

我不能使Key類型的對象,因爲它爲我創建我的表時混亂。

所以我想到從BaseUniqueEntity刪除仿製藥。有沒有辦法做到這一點?我沒有想法,對於Entity Framework我很新。

+0

你可以 - 使它完全定義的東西:'int','Guid','string',不管。但是,那麼所有的實體都必須具有主鍵類型。 – MarcinJuraszek 2014-11-24 02:39:36

+0

我真的很喜歡那個孩子班可以決定他們的鑰匙是什麼類型 – 2014-11-24 04:39:18

回答

0

如何保持通用IRepository接口和定義另一個接口作爲默認密鑰(INT,GUID等) 事情是這樣的一個快捷方式:

public interface IRepository<K, E> 
    where K : IComparable, IComparable<K> 
    where E : BaseUniqueEntity<K> 
{ 
} 

public interface IRepository<E> : IRepository<int, E> 
    where E : BaseUniqueEntity<int> 
{ 
} 

當定義具體庫:

public class UserRepository<User> 
{ 
} 
+0

這種方法也浮現在我的腦海裏,但我不喜歡爲每種可能類型的鑰匙創建新的IRepisotry的想法 – 2014-11-24 04:38:52

1

有沒有辦法編寫一個基本實體,其中主鍵的類型沒有使用泛型指定?

爲什麼你必須寫一個基礎實體?表面上,你所做的只是試圖在每個實體上強制實現一個密鑰,這對於類型來說可能沒有意義(組合鍵可能更有意義,EF支持)。無論如何,Key屬性對於一個實體無論如何都是必需的,那麼究竟是在執行什麼?

沒有規則說每件事都必須從基類繼承。我的建議是:如果你不認爲調用者總是定義鍵類型是有意義的,那麼只需編寫定義他們自己的鍵的類,並使用對他們有意義的類型。

+0

但是如果沒有抽象或基類,因此沒有基類'Key'屬性,我該如何建立一個通用的存儲庫?如果只有實施實體才知道實體的密鑰,我將如何獲得該實體的密鑰? – 2014-11-24 05:42:58

+0

@MatiCicero反思。像這樣的東西應該可以工作:var keyProperty = entity.GetProperties()。Where(p => Attribute.IsDefined(p,typeof(KeyAttribute))); – 2014-11-24 05:51:25

+1

@MatiCicero爲什麼你需要知道'Key'屬性來構建回購?你見過'DbSet.Find'方法嗎?你有暴露'IQueryable '嗎?這不是繼承的情況。它是否滿足Listkov? – Aron 2014-11-24 05:52:23