【问题标题】:Make an entity generated by Entity Framework implement an interface使Entity Framework生成的实体实现一个接口
【发布时间】:2018-12-19 22:00:32
【问题描述】:

你好我有这个界面:

public interface X {
    int Id { get; set; }
    int Number { get; set; }
}

我想要一个由实体框架生成的具有此属性的实体来实现此接口。 我该怎么做? 我试图做一个部分类,但我得到一个编译错误,迫使我在接口中实现属性,如下所示。

public partial class A : X {
    int Id { get; set; }
    int Number { get; set; }
}

这是实体框架生成的类:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Manual changes to this file may cause unexpected behavior in your application.
//     Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace App
{
    using System;
    using System.Collections.Generic;

    public partial class A
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public A()
        {
        }

        public int Id { get; set; }
        public int Number { get; set; }
    }
}

我有这些当前文件:

1.

namespace ConfApp.model
{
    using System;
    using System.Collections.Generic;

    public partial class INSTITUICAO
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public INSTITUICAO()
        {
            this.UTILIZADOR = new HashSet<UTILIZADOR>();
        }

        public int Id { get; set; }
        public string Nome { get; set; }
        public string Morada { get; set; }
        public string Pais { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<UTILIZADOR> UTILIZADOR { get; set; }
    }
}

2.

namespace ConfApp.model {
    public interface IInstituicao {
        int Id { get; set; }
        String Nome { get; set; }
        String Morada { get; set; }
        String Pais { get; set; }
    }
}

3.

namespace ConfApp.model {
    public partial class INSTITUICAO: IInstituicao {
    }
}

【问题讨论】:

  • @Simonare 你是说我应该在实体框架生成的文件中这样做?
  • @pfx 编译器错误说我应该实现属性
  • 我不认为这真的是你想要做的......如果它首先是数据库,那么你希望如何在运行时添加属性/列?我希望更多的课程是通用方法? &lt;TEntity&gt; GetId(this Entity entity){} 也许?
  • @pfx 帖子是用那个类编辑的
  • 你确定你在同一个命名空间中有两个部分类吗?你能显示每个包含命名空间的完整声明吗?我假设他们也在同一个程序集中,对吧?

标签: c# entity-framework


【解决方案1】:

由于您的实体框架生成的类已经包含接口的属性,您只需在类A上声明接口。

整个图片可能包括以下 3 个文件。
确保这些部分类的名称和命名空间匹配,并且两个 .cs 文件是同一个 Visual Studio 项目的一部分。

  1. 接口X.cs
    (按照惯例,在接口前面加上I,如IX。)

    namespace App
    {
        public interface X {
            int Id { get; set; }
            int Number { get; set; }
        }
    }
    
  2. 由实体框架A.cs生成的类
    (保留这个自动生成的原样,如下所示。)

    //------------------------------------------------------------------------------
    // <auto-generated>
    //     This code was generated from a template.
    //
    //     Manual changes to this file may cause unexpected behavior in your application.
    //     Manual changes to this file will be overwritten if the code is regenerated.
    // </auto-generated>
    //------------------------------------------------------------------------------
    
    namespace App
    {
        using System;
        using System.Collections.Generic;
    
        public partial class A
        {
            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
            public A()
            {
            }
    
            public int Id { get; set; }
            public int Number { get; set; }
        }
    }
    
  3. 在类A 上的接口X 的声明例如。 A.partial.cs

    namespace App
    {
        public partial class A : X {
        }
    }
    

【讨论】:

  • 在第 2 点我无法在生成的类中实现接口,因为它有这个命令 //------------------------ -------------------------------------------------- ------ // // 此代码是从模板生成的。 // // 手动更改此文件可能会导致您的应用程序出现意外行为。 // 如果重新生成代码,将覆盖对此文件的手动更改。 // 自动生成> //---------------------------------------- --------------------------------------------------
  • 那是我的错字;修好了。
  • 是的,我有那个代码,但是遇到了我所说的编译错误
  • 那么你有3个独立的文件,内容如上?尝试将文件 3 存储在单独的文件夹中,与实体框架使用的不同。
  • 是的,我有这个
【解决方案2】:
public interface IBaseEntity {
    int Id { get; set; }
    int Number { get; set; }
}

假设你有 Entity Framework 生成的 StudentEntity.cs

namespace MyProject.DAL.Entities
{
    public partial class StudentEntity
    { }
}

创建新文件 StudentEntityExtended.cs 并在其中放置您的部分类

namespace MyProject.DAL.Entities
{
    public partial class StudentEntity : IBaseEntity {

    }
}

然后

public class SchoolContext: DbContext 
{
    public SchoolContext(): base()
    {

    }

    public DbSet<Student> Students { get; set; }
}

现在 Students DbSet 继承自 BaseClass,因此具有来自其 anchestory 的属性

【讨论】:

  • 你不能这样做,因为他试图做的是将接口的实现添加到实体框架生成的部分类中
  • 我们实际上需要问他为什么不能这样做?他有另一个 BaseClass 实现吗?那他为什么不使用它呢?我认为这里有问题
  • 我不能这样做,因为 EF 生成的类有一条评论说我不应该像上面在编辑中显示的那样修改代码
  • 你可以有另一个部分类,你可以在那里继承它。这就是我们使用部分类的原因。
  • 我把它转成界面了,现在有意义了:)
猜你喜欢
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
  • 2013-06-27
  • 2015-05-27
  • 2017-05-18
  • 2020-01-13
  • 1970-01-01
相关资源
最近更新 更多