Actuellement, j'essaie d'utiliser Effort ( https://effort.codeplex.com/ ) avec ma solution Entity Framework 6 pour permettre les tests unitaires sans nécessiter de connexion à la base de données (voir http://www.codeproject.com/Articles/460175 / Deux stratégies pour tester Entity-Framework-Effort ). Tout fonctionne dans mon projet, où il s'agit du DbContext
avec une interface et des constructeurs surchargés requis pour Effort:
namespace Cssd.IT.PortalIntegration.DataAccess.HR.Dao
{
using System;
using System.Data.Common;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
public partial class HRADDbContext : DbContext, IHRADDbContext
{
public HRADDbContext() : base("name=HRADDbContext")
{
}
public HRADDbContext(string nameOrConnectionString)
: base(nameOrConnectionString)
{
this.Configuration.LazyLoadingEnabled = false;
}
public HRADDbContext(DbConnection connection)
: base(connection, true)
{
this.Configuration.LazyLoadingEnabled = false;
}
public virtual DbSet<CCS_DEPT_TBL> CCS_DEPT_TBL { get; set; }
public virtual DbSet<CCS_HR_AD_SYNC> CCS_HR_AD_SYNC { get; set; }
}
}
Le problème est que si je mets à jour le fichier .edmx
en choisissant "Mettre à jour le modèle à partir de la base de données ...", il régénère le fichier de contexte pour qu'il soit:
namespace Cssd.IT.PortalIntegration.DataAccess.HR.Dao
{
using System;
using System.Data.Common;
using System.Data.Entity;
public partial class HRADDbContext : DbContext
{
public HRADDbContext() : base("name=HRADDbContext")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<CCS_DEPT_TBL> CCS_DEPT_TBL { get; set; }
public virtual DbSet<CCS_HR_AD_SYNC> CCS_HR_AD_SYNC { get; set; }
}
}
Je dois donc revenir en arrière et mettre à jour manuellement le fichier Context.cs
ci-dessus à chaque fois. En outre, supprime la [Key]
du fichier POCO CCS_DEPT_TBL
.
Existe-t-il un moyen de configurer mon projet Entity Framework de manière à ce qu'il ne supprime pas l'interface et les constructeurs surchargés chaque fois que je mets à jour le modèle à partir de la base de données? TIA.
METTRE À JOUR:
Comme la classe est partielle, je m'assure simplement que l'interface et les constructeurs surchargés sont placés dans un fichier séparé qui n'est pas généré automatiquement.
MISE À JOUR 2:
OK, il a obtenu, venez d' ajouter cela comme un fichier séparé, en prenant la DEPTID
de l'original POCO
fichier, mais il met toujours que DEPTID
dans le fichier généré, donc après une mise à jour la construction des pauses parce qu'il ya deux DEPTID
valeurs dans le même classe:
namespace Cssd.IT.PortalIntegration.DataAccess.HR.Dao
{
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
public partial class CCS_DEPT_TBL
{
[Key]
public string DEPTID { get; set; }
}
}
Alors, comment l'empêcher de générer DEPTID
dans le fichier de classe généré, puisqu'il se trouve déjà dans le fichier de classe partiel ci-dessus?
Oui, la classe est définie comme une classe partielle. Créez un nouveau fichier qui déclare également la même classe partielle et ajoutez-y vos méthodes supplémentaires.
En ce qui concerne l'attribut [Key] perdu, vous pouvez essayer d'utiliser un attribut MetadataType et y placer toutes vos métadonnées.
namespace Cssd.IT.PortalIntegration.DataAccess.HR.Dao
{
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
[MetadataType(typeof(CCS_DEPT_TBL_Meta))]
public partial class CCS_DEPT_TBL
{
... Your additional constructors and methods here ...
}
public class CCS_DEPT_TBL_Meta
{
[Key]
public string DEPTID { get; set; }
}
}
Merci à Robert McKee! Voici ce que j'ai fini par faire:
CCS_DEPT_TBL_Key.cs:
namespace Cssd.IT.PortalIntegration.DataAccess.HR.Dao
{
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
[MetadataType(typeof(CCS_DEPT_TBL_Meta))]
public partial class CCS_DEPT_TBL
{
}
public class CCS_DEPT_TBL_Meta
{
[Key]
public string DEPTID { get; set; }
}
}
CCS_DEPT_TBL.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 Cssd.IT.PortalIntegration.DataAccess.HR.Dao
{
using System;
using System.Collections.Generic;
public partial class CCS_DEPT_TBL
{
// This table in SQL Server does not have a primary key, it just has an index
public string DEPTID { get; set; }
public string DESCR { get; set; }
public System.DateTime EFFDT { get; set; }
public string EFF_STATUS { get; set; }
public Nullable<System.DateTime> LASTUPDDTTM { get; set; }
}
}
HRModel.Context.cs: HRADDbContext est en fait une entité première dans la base de données, mais trois autres fichiers * .edmx sont des entités dont le code est d'abord dans le même projet. t appliquer. Il serait probablement préférable de séparer les entités de la base de données d'abord dans un projet séparé afin que cette exception ne soit pas générée lors de la mise à jour d'un modèle de base de données.
//------------------------------------------------------------------------------
// <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 Cssd.IT.PortalIntegration.DataAccess.HR.Dao
{
using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
public partial class HRADDbContext : DbContext
{
public HRADDbContext()
: base("name=HRADDbContext")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//throw new UnintentionalCodeFirstException();
}
public virtual DbSet<CCS_DEPT_TBL> CCS_DEPT_TBL { get; set; }
public virtual DbSet<CCS_HR_AD_SYNC> CCS_HR_AD_SYNC { get; set; }
}
}
HRADDbContext.cs, où l'interface IHRADDbContext est nécessaire pour Effort:
using System;
using System.Data.Common;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
namespace Cssd.IT.PortalIntegration.DataAccess.HR.Dao
{
/// <summary>
/// Added interface here so that it does not get removed when updating
/// model from the database on code generation.
/// </summary>
partial class HRADDbContext : IHRADDbContext
{
public HRADDbContext(string nameOrConnectionString)
: base(nameOrConnectionString)
{
this.Configuration.LazyLoadingEnabled = false;
}
public HRADDbContext(DbConnection connection)
: base(connection, true)
{
this.Configuration.LazyLoadingEnabled = false;
}
}
}