【问题标题】:Generic Repository implementation fails with IEntity constraint通用存储库实现因 IEntity 约束而失败
【发布时间】:2014-03-18 18:20:41
【问题描述】:

我正在尝试实现一个通用存储库,但它失败了,因为没有从 DBML 对象到通用实体的隐式转换。我不知道如何让 DBML 对象从 IEntity 继承,或者这是否是解决方案。

以下是我正在使用的接口和存储库签名。

public interface IEntity
{
    int ID { get; } 
}

public interface IRepository<T> : IDisposable
{
    ....
}

public class Repository<T> : IRepository<T> where T : class, IEntity
{
    ....
}

这是模型类。它在第 9 行失败并出现错误(如下),其中存储库类的实例在构造函数中被实例化。这只是在我将 IEntity 约束添加到 Repository 类之后才开始发生的。

public class MyModel
{
    DataContext DC;
    Repository<MyType> MyRep;

    public MyModel()
    {
        DC = new DataContext("ConnStr");
        MyRep = new Repository<MyType>(DC);

    }
}

这是错误:该类型不能用作泛型类型或方法中的类型参数“T”。没有从“MyType”到“IEntity”的隐式引用转换

提前感谢您的帮助。

【问题讨论】:

    标签: c# entity-framework generics


    【解决方案1】:

    看起来MyType 没有实现IEntity 接口。

    使用编辑器打开您的 DBML 文件并添加以下属性:

    EntityBase="IEntity"
    

    Database 元素。

    编辑:不知道是否可以使用 UI 编辑器。

    【讨论】:

    • 是的,但是如何使从自动生成的代码创建的 DBML 类型实现 IEntity?
    • 哦,其他的忘记了。编辑了答案!
    • 我需要在 DBML 文件的哪个位置添加该语句?在 dbml.layout 或 Designer.cs 文件中?
    • 也不行,你应该直接用文本编辑器打开 *.dbml 文件。
    • 我明白了,你说将它添加到数据库节点。对不起,我错过了。这行得通。谢谢。
    【解决方案2】:

    D.R. 的回答在短期内解决了我的问题,但最终我实现了扩展 DBML 对象的部分类。这种方法解决了几个问题。首先,不必在每次发生数据库更改时都编辑 DBML 文件。其次,这使我能够在需要时向 DBML 对象添加其他扩展属性和方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-17
      相关资源
      最近更新 更多