簡體   English   中英

我可以使用並返回EF4代碼優先的POCO實體作為其接口嗎?

[英]Can I use and return EF4 code-first POCO entities as their interface?

鑒於問題后面的代碼,我從EF4代碼優先API獲得以下錯誤:

給定屬性“角色”不是受支持的導航屬性。 屬性元素類型“IRole”不是受支持的實體類型。 不支持接口類型。

基本上,我有一個類似於以下的存儲庫:

public class Repository : IRepository {
    private IEntityProvider _provider;
    public Repository(IEntityProvider provider) {
        _provider = provider;
    }
    public IUser GetUser(int id) {
        return _provider.FindUser(id);
    }
}

請注意,IRepository.GetUser返回一個IUser。

假設我的IEntityProvider實現看起來像這樣。

public class EntityProvider : IEntityProvider {
    public IUser FindUser(int id) {
        /* Using Entity Framework */
        IUser entity;
        using (var ctx = new MyDbContext()) {
            entity = (from n in ctx.Users 
                  where n.Id == id 
                  select (IUser)n).FirstOrDefault();
        }
        return entity;
    }
}

這里的關鍵是IUser接口有一個名為Roles的List <IRole>屬性。 因此,似乎實體框架代碼首先無法弄清楚用於實現屬性所需的IRole接口的類。

下面是將在整個系統中使用的接口和POCO實體,並且希望也可以與EF4一起使用。

public interface IUser {
    int Id { get; set; }
    string Name { get; set; }
    List<IRole> Roles { get; set; }
}

public interface IRole {
    int Id { get; set; }
    string Name { get; set; }
}

public class User : IUser {
    public int Id { get; set; }
    public string Name { get; set; }
    public List<IRole> Roles { get; set; }
}

public class Role : IRole {
    public int Id { get; set; }
    public string Name { get; set; }
}

我是以錯誤的方式來做這件事的嗎? 有沒有辦法在EF4代碼優先API中執行此操作?

我只能想到以下幾點:

  1. EF4代碼優先使用的某種shadow屬性(List <Role> DbRoles)。 然后使用Data Annotations確保EF4忽略實際的List <IRole>。
  2. 為EF4代碼優先使用的所有實體創建重復的類,然后將它們映射到實現該接口的官方實體。

請記住,你需要使基類抽象化(用EF文檔檢查繼承),我建議在其中沒有任何內容的RootEntity,然后是一個帶有一些常見信息的Base實體,如Id,InsertedBy,UpdatedBy like standart字段,它使一切變得更容易。

EF 4 Code First(從CTP5開始)不支持使用接口,並且RTM中也可能不支持使用接口。 我想說在你的DbContext中創建一個抽象類來保存你的對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM