Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 提供一个方法在接口中返回一个实体_C#_Entity Framework - Fatal编程技术网

C# 提供一个方法在接口中返回一个实体

C# 提供一个方法在接口中返回一个实体,c#,entity-framework,C#,Entity Framework,好的,我正在尝试为我的viewmodels创建一个接口,该接口提供了两个必需的方法和一个属性。给你 interface IVmConvertible { IVmConvertible Model { get; set; } Entity ConvertToModel(IVmConvertible target); IVmConvertible ConvertToViewModel(IVmConvertible target); } 我遇到的问题是抽象我的实体框架类,以便

好的,我正在尝试为我的viewmodels创建一个接口,该接口提供了两个必需的方法和一个属性。给你

interface IVmConvertible
{
    IVmConvertible Model { get; set; }
    Entity ConvertToModel(IVmConvertible target);
    IVmConvertible ConvertToViewModel(IVmConvertible target);
}
我遇到的问题是抽象我的实体框架类,以便
ConvertToModel
方法的返回类型将解释我的任何实体。我的
ConvertToViewModel
方法很好,因为我的所有viewmodels都实现了这个接口。我曾想过为我的所有实体创建一个接口,但如果我更改自动生成的代码,它将在每次更改数据库时被删除

如何提取我的
ConvertToModel
方法以返回任何实体?

可能的解决方案是:

interface IVmConvertible<T>
{
    IVmConvertible Model { get; set; }
    T ConvertToModel(IVmConvertible target);
    IVmConvertible ConvertToViewModel(IVmConvertible target);
}

此解决方案可能适合您的需要,也可能不适合您的需要。这是我们在这里做的事情,我不确定我是否完全理解您的要求。在这些示例中,我假设
实体
类使用不同的接口,而不是
IVmConvertable
。我没有提到泛型(这可能是一个很好的方法,因为已经讨论过了)

手动操作

  • 创建一个单独的类文件,如
    EntitesPartialClass.cs
  • 为每个实体添加分部类
  • 让分部类实现接口/etc(您甚至可以派生!)
  • 类文件:

    public partial class MyEntityClass: IMyEntity {
         .... 
    }
    
    最好是显式地实现接口,以便在能够使用方法之前强制调用方对其进行强制转换。因为您期望接口,所以这没有问题,但其他人不会感到困惑

    public partial class MyEntityClass : IMyEntity {
         IMyEntity.MyMethod() { }
    }
    
    如果您确实从基类派生,请使该基类以相同的方式实现接口

    修改t4模板文件

    我这样做是为了将edmx文件中的文档属性添加到类输出中

  • 找到第一个循环(
    foreach(变量实体在…
  • 查找类定义(以
  • 更新定义以添加自定义接口
  • 这可能需要一些工作,因为EF类也可以有另一个类作为基类。我认为相关的更改如下所示:

    public class CarVm : IVmConvertible<Car>
    {
    ...
    }
    
    //-- original --
    <#=Accessibility.ForType(entity)#><#=code.SpaceAfter(code.AbstractOption(entity))#>partial class <#=code.Escape(entity)#><#=code.StringBefore(" : ", code.Escape(entity.BaseType))#>
    
    /--original--
    部分类
    
    {

    /--new---
    部分类
    :IMyEntity
    {
    //在TT文件中实现IMyEntity
    
    泛型可能会有所帮助?
    //-- original --
    <#=Accessibility.ForType(entity)#><#=code.SpaceAfter(code.AbstractOption(entity))#>partial class <#=code.Escape(entity)#><#=code.StringBefore(" : ", code.Escape(entity.BaseType))#>
    
    //-- new ---
    <#=Accessibility.ForType(entity)#><#=code.SpaceAfter(code.AbstractOption(entity))#>partial class <#=code.Escape(entity)#>
        : IMyEntity <#=code.StringBefore(", ", code.Escape(entity.BaseType))#>
    {
        // implement IMyEntity here, in the TT file