Onur ERYILMAZ Ответов: 0

Вопрос о фреймворках сущностей и шаблоне проектирования репозитория


Привет,

Я хочу задать несколько вопросов о реализации шаблона проектирования EF и репозитория.

Я очень новичок в EF и хочу узнать об этом больше.

У меня уже есть база данных и таблицы внутри нее. Поэтому я не хочу, чтобы entity Framework повторно генерировал эти таблицы.(Поэтому я должен использовать первый подход DB, я думаю)
Я просто хотел легко выполнять грязные операции.

И я хотел использовать этот шаблон репозитория с сервисом wcf.

Могу ли я использовать EF с уже созданными таблицами?

Заранее спасибо.

Что я уже пробовал:

Сначала мой конфигурационный файл(web.config), который не может быть подключен к базе данных.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5.2" />
    <httpRuntime targetFramework="4.5.2" />
    <httpModules>
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" />
    </httpModules>
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="web">
          <webHttp />
        </behavior>
        <behavior>
          <dataContractSerializer maxItemsInObjectGraph="1000" />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <services>
      <service name="BilplasWcfService.BilplasWebService" behaviorConfiguration="ServiceBehavior">
        <endpoint binding="webHttpBinding" contract="BilplasWcfService.IBilplasWebService" behaviorConfiguration="web"></endpoint>
      </service>
    </services>
    <protocolMapping>
      <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="ApplicationInsightsWebTracking" />
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" />
    </modules>
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      -->
    <directoryBrowse enabled="true" />
    <validation validateIntegratedModeConfiguration="false" />
  </system.webServer>
  <connectionStrings>
    <!--<add name="StockManagementSystemConnectionString" connectionString="Data Source= DESKTOP-E0NKE43\BILPLASMAIN; Initial Catalog=BILPLAS; User Id= stock; Password= stock1stock2;"/>-->
    <add name="StockManagementSystemConnectionString" connectionString="Data Source= DESKTOP-E0NKE43\BILPLASMAIN; Initial Catalog= BILPLAS; User Id= stock; Password= stock1stock2;" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
      <parameters>
        <!--<parameter value="mssqllocaldb" />-->
        <parameter value="Data Source= DESKTOP-E0NKE43\BILPLASMAIN; Initial Catalog= BILPLAS; MultipleActiveResultSet= True; User Id= stock; Password= stock1stock2;"/>
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>


Мой DBContext;
public class EFDBContext : DbContext
    {
        public EFDBContext() : base("name=StockManagementSystemConnectionString") { }        
        public new IDbSet<TEntity> Set<TEntity>() where TEntity : class
        {
            return base.Set<TEntity>();
        }
        public virtual DbSet<WorkCommandProduction> WorkCommandsInProduction { get; set; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            var typesToRegister = Assembly.GetExecutingAssembly().GetTypes().Where(type => !string.IsNullOrEmpty(type.Namespace)).Where(type => type.BaseType != null && type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>));
            foreach(var type in typesToRegister)
            {
                dynamic configurationInstance = Activator.CreateInstance(type);
                modelBuilder.Configurations.Add(configurationInstance);
            }
            base.OnModelCreating(modelBuilder);
        }
    }


Мой Универсальный Репозиторий;

public class Repository<TEntity> : IRepository<TEntity> where TEntity : class
    {
        protected readonly EFDBContext context;
        //private IDbSet<T> entities;
        string errorMessage = string.Empty;

        public Repository(EFDBContext context)
        {
            this.context = context;
        }

        public TEntity GetbyID(int id)
        {
            return context.Set<TEntity>().Find(id);
        }
        public IEnumerable<TEntity> GetAll()
        {
            try
            {
                return context.Set<TEntity>().ToList();
            }
            catch (DbEntityValidationException dbEx)
            {
                throw new Exception(GetErrorMessage(dbEx), dbEx);
            }
        }
        public void Insert(TEntity entity)
        {
            try
            {
                if (entity == null)
                    throw new ArgumentNullException("entity");

                context.Set<TEntity>().Add(entity);
            }
            catch(DbEntityValidationException dbEx)
            {
                throw new Exception(GetErrorMessage(dbEx), dbEx);
            }
        }
        public void Delete(TEntity entity)
        {
            try
            {
                if (entity == null)
                    throw new ArgumentNullException("entity");

                context.Set<TEntity>().Remove(entity);
            }
            catch(DbEntityValidationException dbEx)
            {
                throw new Exception(GetErrorMessage(dbEx), dbEx);
            }
        }
        public IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> predicate)
        {
            return context.Set<TEntity>().Where(predicate);
        }

        //private IDbSet<T> Entities
        //{
        //    get
        //    {
        //        if (entities == null)
        //            entities = context.Set<T>();
        //        return entities;
        //    }
        //}
        private string GetErrorMessage(DbEntityValidationException dbEx)
        {
            foreach (var validationErrors in dbEx.EntityValidationErrors)
            {
                foreach (var validationError in validationErrors.ValidationErrors)
                {
                    errorMessage += string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage) + Environment.NewLine;
                }
            }

            return errorMessage;
        }


Мой репозиторий для конкретного объекта

public class WorkCommandProductionRepository : Repository<WorkCommandProduction>, IWorkCommandProductionRepository
    {
        public WorkCommandProductionRepository(EFDBContext context) : base(context)
        {
            context.Database.Exists();
            string state = context.Database.Connection.State.ToString();
        }

        public IEnumerable<WorkCommandProduction> GetAllWorkCommandsInProduction(int from, int to)
        {
            context.Database.Exists();
            string state = context.Database.Connection.State.ToString();
            return EFDBContext.WorkCommandsInProduction.ToList();
        }

        public IEnumerable<WorkCommandProduction> GetAllWorkCommandsOutOfProduction(int from, int to)
        {
            throw new NotImplementedException();
            //return EFDBContext.WorkCommandsOutOfProduction.ToList();
        }
        
        public EFDBContext EFDBContext
        {
            get { return context as EFDBContext; }
        }
    }


Моя часть работы

public class UnitOfWork : IUnitOfWork
    {
        private readonly EFDBContext context;
        private bool disposed;
        private Dictionary<string, object> repositories;

        public UnitOfWork(EFDBContext context)
        {
            this.context = context;
            WorkCommandsInProduction = new WorkCommandProductionRepository(this.context);
        }
        public UnitOfWork()
        {
            this.context = new EFDBContext();
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        public IWorkCommandProductionRepository WorkCommandsInProduction { get; private set; }

        public void Save()
        {
            context.SaveChanges();
        }

        public virtual void Dispose(bool disposing)
        {
            if(!disposed)
            {
                if (disposing)
                    this.context.Dispose();
            }
            disposed = true;
        }

        public Repository<TEntity> Repository<TEntity>() where TEntity : WorkCommandProductionBase
        {
            if (repositories == null)
                repositories = new Dictionary<string, object>();

            var type = typeof(TEntity).Name;

            if(!repositories.ContainsKey(type))
            {
                var repositoryType = typeof(Repository<>);
                var repositoryInstance = Activator.CreateInstance(repositoryType.MakeGenericType(typeof(TEntity)), this.context);
                repositories.Add(type, repositoryInstance);
            }

            return (Repository<TEntity>)repositories[type];
        }
    }

Saineshwar Bageri

Есть ли какая-то ошибка, с которой вы столкнулись.

Onur ERYILMAZ

Да, он не получает entites из базы данных.

Saineshwar Bageri

Это некоторый пример универсального репозитория, который может вам помочь.

1. https://www.codeproject.com/Articles/1095323/Generic-Repository-Pattern-MVC
2. https://www.codeproject.com/Articles/814768/CRUD-Operations-Using-the-Generic-Repository-Patte

0 Ответов