Заставить сущность, созданную Entity Framework, реализовать интерфейс - PullRequest
0 голосов
/ 20 декабря 2018

Привет, у меня есть этот интерфейс:

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

И я хочу, чтобы объект, сгенерированный Entity Framework, имел эти свойства для реализации этого интерфейса.Как мне это сделать?Я попытался создать частичный класс, но получаю ошибку компиляции, которая вынуждает меня реализовать свойства интерфейса, как показано ниже.

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

Это класс, сгенерированный Entity Framework:

//------------------------------------------------------------------------------
// <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 {
    }
}

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Поскольку ваш класс, сгенерированный Entity Framework, уже содержит свойства для интерфейса, вам нужно объявить интерфейс только для класса A.

Вся картинка может включать в себя следующие 3 файла.
Убедитесь, что имена и пространства имен этих частичных классов совпадают, и что оба .cs файла являются частью одного проекта Visual Studio.

  1. Интерфейс X.cs
    (Условно префикс интерфейса * I, как в IX.)

    namespace App
    {
        public interface X {
            int Id { get; set; }
            int Number { get; set; }
        }
    }
    
  2. Класс, сгенерированный Entity Framework 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. Объявление интерфейса X в классе A в например.A.partial.cs

    namespace App
    {
        public partial class A : X {
        }
    }
    
0 голосов
/ 20 декабря 2018
public interface IBaseEntity {
    int Id { get; set; }
    int Number { get; set; }
}

Предположим, что у вас есть StudentEntity.cs, сгенерированный Entity Framework

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; }
}

Теперь студенты DbSet наследуются от BaseClass, таким образом, имея свойства из своего предка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...