The Road Ahead… to .NET
May 15th
In the .NET Framework expertise track, the learning curve is huge and always complex because of the simplicity of the marketing effect… Nothing is easy even .NET Framework. In July 2001, Microsoft shipped .NET Framework BETA 2. In 2012, the technology is fully open in most of its fundamentals. .NET Framework 2.0 is the NET Core subsystem because it contains the layers where WCP, WPF and WF were built on. Master .NET 2.0 and you will be confident for upper versions.
Steps to achieve to master the technology and understand the whole stack (compiler, metadata, JIT, CLR and Garbage collection):
- rebuild and study .NET Framework 1.0 and .NET Common Language Runtime (Shared Source CLI 1.0) http://www.microsoft.com/en-us/download/details.aspx?id=14124
- rebuild and study .NET Framework 2.0 and .NET Common Language Runtime (Shared Source CLI 2.0) http://www.microsoft.com/en-us/download/details.aspx?id=4917 – SSCLI 2.0 introduces the .NET foundations.
- rebuild and study the Microsoft Research CCI program
Common Compiler Infrastructure – Metadata
Common Compiler Infrastructure – Code and AST components
Common Compiler Infrastructure – Sample applications
- download and learn about Microsoft Research Phoenix Compiler Infrastructure http://research.microsoft.com/en-us/collaboration/focus/cs/phoenix.aspx
These technology is currently a private and hot topic billion dollar technology. Shipped internally in VS11 as Microsoft Infrastructure Compiler assembly, it is the foundation of the new << Windows >> Compiler. Phoenix should be open and modular. Study GCC, CLang and LLVM, you’ll be in touch
- the little magic software that enables to rebuild everything is located under Windows SDK for Windows 7 and NET Framework 4. It contains all the necessary tools for free… http://www.microsoft.com/en-us/download/details.aspx?id=8442
- If the command line compiler seems to fuzzy (a nightmare), just get a Visual C++ Edition (even an Express Edition could be ok).
Software development is not marketing. Learn. Study. Train. Build. Ship. All of this is not magical.
Microsoft Technologies and the Navy Marine Corps
May 5th
Some technologies can help to save life. Discover how Microsoft is helping the Navy with its FORCEnet program. The article is hosted on my blog and is focused on native development. The information is public and available via the navy portal and the Navy Marine Symposium event held in Redmond every year. Microsoft helps the Navy with advanced development on mobile device and core modules of the windows operating systems. I had the chance to reach the symposium in some years ago and it was amazing. Some informations are shared here. Enjoy !
http://www.windowscpp.net/2012/05/05/microsoft-technology-in-navy-and-defense-warfare/
Inside Microsoft Windows Source Code – Windows Research Kernel
May 3rd
The Windows Research Kernel v1.2 contains the sources for the core of the Windows (NTOS) kernel and a build environment for a kernel that will run on
x86 (Windows Server 2003 Service Pack 1) and
AMD64 (Windows XP x64 Professional)
The NTOS kernel implements the basic OS functions for processes, threads, virtual memory and cache managers, I/O management, the registry, executive functions such as the kernel heap and synchronization, the object manager, the local procedure call mechanism, the security reference monitor, low-level CPU management (thread scheduling, Asynchronous and Deferred Procedure calls, interrupt/trap handling, exceptions), etc.
WRK v1.2 includes most of the NTOS kernel sources from the latest released version of Windows, which supports the AMD64 architecture on the Desktop. The kernel sources excluded from the kit are primarily in the areas of plug-and-play, power management, the device verifier, kernel debugger interface, and virtual dos machine. The primary modifications to WRK from the released kernel are related to cleanup and removal of server support, such as code related to the Intel IA64.
The public\ directory contains a number of include files shared among system components. base\ntos\ contains the NTOS sources.
The primary NTOS source components included in the WRK are organized as follows:
cache\ – cache manager
config\ – registry implementation
dbgk\ – user-mode debugger support
ex\ – executive functions (kernel heap, synchronization, time)
fsrtl\ – file system run-time support
io\ – I/O manager
ke\ – scheduler, CPU management, low-level synchronization
lpc\ – local procedure call implementation
mm\ – virtual memory manager
ob\ – kernel object manager
ps\ – process/thread support
se\ – security functions
wmi\ – Windows Management Instrumentation
inc\ – NTOS-only include files
rtl\ – kernel run-time support
init\ – kernel startup
Inside Microsoft Source Code – What is .NET Framework ?
May 2nd
In July 2001, Microsoft has shipped « Microsoft .Net Framework SDK Beta 2 ». Do you remember these old days? Do you remember what .NET is? From the marketing side, you will find some PowerPoint presentations but from the Team that built it, here is the memo from the Windows Source Code Training.
What is .NET? …
- Microsoft Marketing: “Microsoft .NET is software that connects information, people, systems, and devices. It spans clients, servers, and developer tools.”
- A vision or marketing strategy, as much as a technology
- .NET is a “software platform”
- Language-neutral environment
- Produces programs that can easily and securely interoperate
- “.NET” programs should run wherever .NET is implemented
- Not targeted or tied to a particular hardware/OS combination
- Framework for developing all types of applications – especially client-server and web applications
… What is .NET? …
- .NET is also the collective name given to various bits of software built upon the .NET platform
- Some products:
- Visual Studio.NET
- Windows 2003 Server
- SQL Server
- BizTalk Server
- etc.
- Some services
- e.g. Passport
- Some products:
- Client systems, such as Windows XP, Windows CE, Microsoft Office
… What is .NET?
- C# and Common Language Infrastructure are international standards (ECMA)
- Common Language Infrastructure (CLI)
- Common Language Runtime (CLR)
- Common Type System (CTS)
- Common Language Specification (CLS)
- Framework Class Libraries
- Specifications available at
http://www.ecma-international.org/ or http://msdn.microsoft.com/net/ecma/
- Web Services
- Assemblies
- Metadata
- Attributes
- Managed Code and Data
- Microsoft Intermediate Language (MSIL)
Microsoft Intermediate Language …
- All .NET languages compile into Microsoft Intermediate Language (MSIL)
- In the ECMA standard, MSIL is known as the Common Intermediate Language (CIL)
- Processor-neutral pseudo machine language
- Similar in concept to Java byte code
- But, designed to be compiled into native processor instructions before being run (rather than interpretated)
- Converted to executable machine code by the Framework JIT (Just in Time) compiler
- MSIL assembler converts MSIL text into MSIL binary
- [ilasm.exe : root\NT\com\netfx\src\clr\ilasm]
- Just-in-Time compiler performs transformation from MSIL to native processor instructions
- [root\NT\com\netfx\src\clr\jit]
… Microsoft Intermediate Language
- .NET Execuatables (.exe’s) and DLLs contain MSIL
- Not x86 machine code
- ILDASM is an MSIL “disassembler”
- [ildasm.exe : root\NT\com\netfx\src\clr\ildasm]
- “Obfuscator” converts class/method/variable names in a .NET executable into unintelligible equivalents to help prevent reverse-enginering a .NET program
- [root\NT\com\netfx\src\clr\toolbox\obfus]
- MSIL may be “pre-compiled” into native processor instructions before runtime using NGEN utility
- [ngen.exe : root\NT\com\netfx\src\clr\tools\ngen]
Common Language Runtime …
- Manages memory
- All memory allocations come from a single process heap
- Automatic garbage collection
- No API to free memory (“garbage collection” performed automatically)
- Thread execution
- Code execution
- Type safety verification
- Compilation (Just in Time (JIT) compiler)
- Exception handling
- Language neutral
… Common Language Runtime …
- CLR Security
- PKI/CS7 signing and encryption supported
- Also used by Authenticode
- Signing and encrypting XML
- Allows sending of encrypted data over SOAP
- W3C standard
- X.509 certificates
- Widely used standard for digital certificates
- Many uses, including Secure Socket Layer (SSL)
- PKI/CS7 signing and encryption supported
- Code Access Security (CAS)
- CAS enforces security policies by preventing unauthorized access to protected resources and operations
- Restricts what your code can do
- Restricts which code can call your code
- Authenticates code
- CAS enforces security policies by preventing unauthorized access to protected resources and operations
… Common Language Runtime
- CAS consists of the following elements
- Permissions: represent access to a protected resource or operation
- FileIOPermission, RegistryPermission, UIPermission, etc.
- Permission sets: collections of permissions
- FullTrust, Nothing, Internet, etc.
- Code groups: specifies a grouping of code with specific conditions for membership
- Particular web site, local system, Internet zone, etc.
- Evidence: provided by the .NET framework to authenticate assemblies at three levels: enterprise, machine, and user
- Where did the assembly come from?
- Does the assembly have a strong name?
- Assemblies with strong names are cryptographically signed to prevent tampering
- Policy: determines the permissions to grant to code
- [root\NT\com\netfx\src\clr\toolbox\caspol]
- Permissions: represent access to a protected resource or operation
Common Language Infrastructure
- Subset of CLR submitted to ECMA standards organization
- C# (C-Sharp)
- Semantics for metadata
- Microsoft Intermediate Language (MSIL)
- Parts of the .NET Framework class library
- “ROTOR” Shared Source Common Language Infrastructure http://www.sscl.net
Common Type System
- A single type system shared by all .NET-compliant compilers, tools, and the CLR
- Everything is an object
- No variant records (each variant is its own object type)
- Native string type
- All strings are Unicode
- Passed by descriptor; no more zero terminated strings!
- The CTS ensures that all classes are compatible with each other, by describing types in a common way. The CTS defines how types work within the runtime (their declaration and usage), which enables types in one language to interoperate with types in another language, including cross-language exception handling. The CTS also ensures that types are used only in appropriate ways
- The runtime also ensures that code doesn’t attempt to access memory that hasn’t been allocated to it
Common Language Specification
- Contract between the language designer/implementer and the .NET Framework
- Subset of Common Type System
- Must be supported by language in order to be .NET compliant
- All CLS features guaranteed to be available in all languages
Framework Class Libraries
- Object oriented hierarchical collection of reusable classes
- Replaces Win32 API
- Base Class Library (BCL)
- Data and XML classes
- ASP.NET
- XML Web Services
- Web Forms
- Windows Forms
Class Libraries …
- System
- .CodeDom
root\NT\com\netfx\src\framework\compmod\system\codedom - .Collections
root\NT\com\netfx\src\clr\bcl\system\collections - .ComponentModel
root\NT\com\netfx\src\framework\compmod\system\
componentmodel - .Configuration
root\NT\com\netfx\src\framework\config\system\configuration - .Data
root\NT\com\netfx\src\framework\data\systemdata - .Diagnostics
root\NT\com\netfx\src\clr\bcl\system\diagnostics
root\NT\com\netfx\src\framework\compmod\system\diagnostics - root\NT\com\netfx\src\framework\services\monitoring\system\
diagnostics
- .CodeDom
… Class Libraries …
- System (continued)
- .DirectoryServices
root\NT\com\netfx\src\framework\services\ds\system\
directoryservices - .Drawing
root\NT\com\netfx\src\framework\commonui\system\drawing - .EnterpriseServices
root\NT\com\netfx\src\clr\managedlibraries\enterpriseservices - .Globalization
root\NT\com\netfx\src\bcl\system\globalization - .IO
root\NT\com\netfx\src\clr\bcl\system\io
root\NT\com\netfx\src\framework\services\io\system\io - .Management
root\NT\com\netfx\src\config\wmi - .Messaging
root\NT\com\netfx\src\framework\services\messaging\system\
messaging
- .DirectoryServices
… Class Libraries …
- System (continued)
- .Net
root\NT\com\netfx\src\framework\net\system\net - .Reflection
root\NT\com\netfx\src\clr\bcl\system\reflection - .Resources
root\NT\com\netfx\src\clr\bcl\system\resources
root\NT\com\netfx\src\framework\winforms\managed\system\
resources - .Runtime
root\NT\com\netfx\src\clr\bcl\system\runtime - .Security
root\NT\com\netfx\src\clr\bcl\system\security
root\NT\com\netfx\src\clr\clr\managedlibraries\security\
system\security - .ServiceProcess
root\NT\com\netfx\src\framework\services\servproc\system\
serviceprocess
- .Net
… Class Libraries
- System (continued)
- .Text
root\NT\com\netfx\src\clr\bcl\system\text - .Threading
root\NT\com\netfx\src\clr\bcl\system\threading
root\NT\com\netfx\src\framework\compmon\system\
threading - .Timers
root\NT\com\netfx\src\framework\services\timers\system\
timers - .Web
root\NT\com\netfx\src\framework\compmods\system\
security\permissions - .Windows.Forms
root\NT\com\netfx\src\framework\winforms\managed\
system\winforms - .Xml
root\NT\com\netfx\src\framework\data\system\newxml
- .Text
Side by Side …
- Side-by-side allows multiple versions of .NET framework to coexist on same system
- Introduced in Framework 1.1
- Vast majority of applications will work with new versions of framework – very little intentional breakage
- Applications prefer the version that they were built against
- Administrator may specify (after testing!) that an application use a newer version of the framework
- Applications built against newer version of framework will not work with older version of framework, if the application uses new features only present in newer version
- Applications prefer the version that they were built against
- Part of image activator [root\nt\base\ntdll\sxs*.c]
… Side by Side …
- Traditional client applications (Windows Forms, Windows Services, command window applications), are configured with an application configuration file
- Config file tells CLR which framework version to load
- Config file is an XML file in the same directory as the .exe file
- Same name as .exe file, with .config suffix
- Config file also affects other areas of behavior
- Applications without .config file, or don’t specify SupportedRuntime, will only work with the version against which they were built against, or a later version if the exact version isn’t available
- Framework version included in .exe image header
- If a suitable version is not found, a dialog box will ask the user which version to use
- May be supressed by setting HKLM\Software\Microsoft\.NETFramework\NoGuiFromShim=1
… Side by Side
- Web applications (ASP.NET, XML Web Services) are configured through the IIS administrator
- Web servers may be configured to use separate versions of the Framework for each individual web site
- Sites that don’t specify default to what the server was configured to use
- Configuration through the IIS administrative console, by selecting the specific versions of the ASP.NET ISAPI filter
- ASP.NET filter [aspnet_filter.dll] on the ISAPI Filter tab of the Web Site Properties dialog
- Filter may be set for each web site, or the server (change filter for root web site)
Web Services
- XML
- Describes information in a structured format
- World Wide Web Consortium (W3C) standard
- WDSL
- XML-based language which defines web services interfaces
- Similar to IDL, used by COM and CORBA
- SOAP
- Provides an XML “envelope” for exchanging data across a network
- Encoding rules for application-defined data types
- Protocol for Remote Procedure Calls (RPC)
- UDDI
- An organization of business that want to expose web services through a registry (which is also a web service)
Assemblies …
- .NET programs are constructed from “Assemblies“
- A compiled and versioned collection of code and metadata that forms an atomic functional unit
- All Assemblies contain a Manifest, which contains:
- the Assembly name
- version
- locale
- a list of files that form the Assembly
- what dependencies the Assembly has
- what features are exported by the Assembly
- Manifest may be manipulated with the GenMan32 utility
- [root\NT\com\netfx\src\clr\toolbox\genman32]
- An assembly may be contained in a single file, or spread across multiple files
- Assembly dependencies can be displayed with “Adepends”
- [root\NT\com\netfx\src\clr\toolbox\adepends]
… Assemblies …
- Assembly types:
- Private
- Private assemblies live within an application’s directory
- Private assemblies are typically written by the author of an application, for use by that application
- Version control is left to the discretion of the author
- The assembly name is the filename (without any file extension), of the file that contains the manifest
- Private
… Assemblies …
- Assembly types:
- Shared
- Shared assemblies live in a common Assembly repository (currently, %systemroot%\Assembly), called the Global Assembly Cache (GAC)
- Shared assemblies are intended to be used by multiple authors, and therefore have stricter constraints
- Rigorous version control
- Assembly names are unique
- Shared assemblies contain a pair of encryption keys (one “public”, and one “private“)
- The private key is kept secret by the author of the assembly
- The public key is published within the manifest. The file containing the manifest is hashed, and that value is signed with the private key
- Shared
… Assemblies …
- When loading a shared assembly, the following are used to identify which assembly to load: name, public key, version, locale
- Requiring this information allows multiple versions of the same assembly to co-exist (the GAC might contain 1.0.0.0/English, 1.0.0.9/Italian and 2.0.0.0/English for a particular assembly )
- When installing an assembly into the GAC, the system verifies the digital signature of the manifest file
- Hashing the manifest file, decrypting the signature stored in the manifest using the public key, and then comparing the two hashes
… Assemblies …
- The rest of the verification occurs at runtime
- When an assembly from the GAC is referenced, the runtime compares the public key of the assembly to the public key that the referring assembly has in its manifest. If they don’t match, an exception is thrown, and the load fails
- If the assembly has multiple parts, each part is hashed as it is loaded, and this hash is compared to the value stored in the manifest — if they do not match, an exception is thrown, and the load fails
- When an application needs to use a particular assembly, it queries the GAC for an assembly matching the name, public key, version, and locale
- The components of the assembly have their hashes checked. If an assembly can be found that matches the query, and it hasn’t been tampered with, then the assembly can be loaded
… Assemblies
- Assemblies eliminate dll conflicts
- Multiple versions of “the same” assembly can co-exist in the GAC,
- Libraries no longer have to maintain backwards compatibility with their predecessors
- A program will always get the version of the assembly that it is expecting
- This can be done even within the same program — if you have a web server, you can run multiple versions of the same application within it, side-by-side.
- Multiple versions of “the same” assembly can co-exist in the GAC,
- Guarantees that files will not be modified after their release
- Viruses cannot infect a file without changing its hash
- Application memory allocation profiling via “AllocationProfiler” tool
- [root\NT\com\netfx\src\clr\toolbox
\allocationprofiler]
- [root\NT\com\netfx\src\clr\toolbox
Metadata
- An important feature of managed code
- Metadata is data that describes other data
- Assemblies rely on several types of metadata
- The security privileges required by the assembly
- Descriptions of classes, types, methods, and members
- Makes the assemblies self-describing, and ensures that the descriptions are always accurate
- Unlike mechanisms such as C/C++ header files, where the interface described in the header could become out of date, and no longer an accurate description of how a library works (“fragile interface” problem)
- Removes the need for an interface description or type library file, such as Interface Description Language (IDL) used in COM development
- Describes the classes in an assembly so that other classes (perhaps in other languages) can inherit from them
- [root\NT\com\netfx\src\clr\md]
Attributes …
- Attributes provide a flexible and extensible way of modifying the compile-time and run-time environment
- ‘DllImport’ is used to denote that a function should be imported from a native library (a DLL), rather than being in a .NET library
- To import a function from a DLL, write an appropriate function prototype, and apply an attribute to that prototype that tells the runtime, “go get the code for this function from this library“
- The runtime hides the messy details, such as “this imported function won’t be in IL but is instead native code”
- Allows the programmer to concentrate on solving their problem – not the mechanics of the solution
- The runtime hides the messy details, such as “this imported function won’t be in IL but is instead native code”
- Attributes can also act at compile-time
- An attribute allows a function to be marked as obsolete, so that the compiler emits a warning informing the programmer
… Attributes
- Programmers may define their own run-time attributes
- To define an attribute, create a class that derives from System.Attribute
- For example, an attribute to describe the author of each piece of code, and when it was last modified it
- Define an attribute with a “name” property and a “modified date” property
- The people writing the code would use this attribute to annotate their code
- At runtime it is possible to interrogate these attributes, and find out who wrote each class and when. Or do anything else that you defined; some attributes do some complex things (e.g., there are attributes that turn your .NET class into a COM class, without requiring you to write any COM code at all!!).
Managed vs. Unmanaged …
- “Managed Code” is code whose lifetime and execution is managed by the CLR
- Managed code targets .NET, and contains metadata to describe itself
- Managed and unmanaged code can run in the runtime, but only managed code contains the information that allows the runtime to guarantee, safe execution and interoperability
- “Managed Data” is a dynamic memory management scheme
- The CLR provides memory allocation and garbage collection Some .NET languages use Managed Data by default (C#, Visual Basic.NET, JScript.NET), while others (C++), do not.
- Targeting the CLR can impose constraints on language features
- C++ loses multiple inheritance
… Managed vs. Unmanaged …
- Some languages will lose case sensitivity (C, C++, Java)
- Names exposed to classes in other assemblies have to be differentiated by more than case
- Names internal to a class’s implementation can still be distinguished only by case
- As with managed and unmanaged code, there can be both managed and unmanaged data
- Data that doesn’t get garbage collected (deallocated) by the CLR, but is managed and deallocated by unmanaged code
- Garbage collector knows when one object’s data fields reference another object
- Easily allows components written in one language to be used by components written in another language
- At runtime, an application can determine which types are in a file, and what members the type defines (a.k.a. late binding)
- Data that doesn’t get garbage collected (deallocated) by the CLR, but is managed and deallocated by unmanaged code
… Managed vs. Unmanaged
- “Unmanaged applications” are not built using the .NET Framework
- May use the services of managed applications through COM interop
- May be configured to specify which version of Framework to use for its managed components (with a .config file, just like a managed app)
- By default, managed components which are loaded by an unmanaged application, the latest version of the Framework is used
- Unmanaged applications do not have the framework version in their image header (unlike a managed app)
- By default, managed components which are loaded by an unmanaged application, the latest version of the Framework is used
Visual Studio 2010 & les outils autours des données (SQL)
Apr 11th
Post Original http://microsofttouch.fr/blogs/vincent/archive/2012/01/11/visual-studio-2010-amp-les-outils-autours-des-donn-233-es-sql.aspx
Introduction
Visual Studio comporte plusieurs outils souvent méconnus des développeurs pour ce qui est de la « gestion » des bases de données SQL Server. Ne vous êtes-vous jamais posé la question, après avoir modifié le fichier EDMX d’une application en production pour constituer une nouvelle version : « Comment être sûr de n’avoir rien oublié avant de mettre en PROD ?»
Ou bien encore après avoir joué des modifications sur les données en elle-même en production et en développement « comment vais-je faire pour avoir les mêmes données partout ? »
Visual Studio est capable de répondre à ces questions grâce à deux outils, celui de comparaison de schémas et celui de comparaison de données. Autour de notre exemple nous verrons aussi d’autres outils de « gestion » des données dans Visual Studio.
Rappels
Au fur et à mesure de la rédaction de l’article je me suis rendu compte que je ne pouvais pas aborder certains concepts sans avoir fait des rappels au préalable.
Microsoft SQL Server est un serveur de bases de données relationnelles (et tant qu’on est dans les rappels, il existe d’autres paradigmes de stockage des données, arborescent, raw, etc.), avec le temps il s’est étoffé de nombreux outils et fonctionnalités (Agent, Reporting Services, Analysis Services…).
Visual Studio 2010 est un environnement de développement intégré, de même avec le temps il a intégré de nombreux outils qui sont ou ne sont pas disponibles selon l’édition de Visual Studio que vous possédez. J’ai la chance de disposer de Visual Studio Ultimate, il se peut que certaines options n’apparaissent pas ou soient présentées différemment selon votre édition de Visual Studio.
Pour bien utiliser Visual Studio il faut bien saisir l’optique sous-jacente. Nous pouvons déjà distinguer plusieurs types « d’outils » dans Visual Studio :
-Les outils de développement et de modélisation, c’est-à-dire que je conçois une application, je la développe et je la déploierai plus tard.
-Les outils de gestion et de réingénierie, c’est-à-dire que mon application existe déjà (souvent dans une version différente) et on me demande d’intervenir sur quelque chose d’existant, de reprendre un travail etc.
-A cela s’ajoute le sucre de l’IDE, c’est-à-dire l’intégration de ces outils les uns avec les autres qui vous permettent une industrialisation du développement et de la reprise de données plus facile.
A noter que Visual Studio n’est en aucun cas un outil d’administration, il y a des outils dédiés à cela. (SQL Management Studio dans notre cas)
Création du modèle de base
Pour illustrer mes exemples tout au long de cet article je vais commencer par créer un modèle EDMX. Si vous ne maitrisez pas cette partie du .NET Framework ce n’est pas grave vous pourrez comprendre la suite de l’article. J’aurais tout aussi bien pu créer une base de données SQL directement ou un projet de base de données). L’idée de cette sous partie n’est pas de vous apprendre à vous servir d’un EDMX, mais simplement de vous indiquer que j’ai aussi utilisé ces outils dans cet article et que ça existe. Voici tout de même quelques précisions sur la chose pour vous aider à comprendre, et je vous encourage à creuser ce sujet :
Cet outil (l’éditeur d’EDMX) fait partie de la classe « outils de modélisation et/ou de développement » citée plus haut.
Un EDMX est une modélisation objet-base de données qui permet de générer automatiquement la couche d’accès aux données au sein de projets ainsi que les scripts de création du contenu de la base. Pour en ajouter un à votre projet il suffit d’aller dans la section « données » du langage utilisé et de sélectionner ADO.NET Entity Data Model.
L’Entity Framework (technologie sous-jacente), les EDMX ainsi que les outils associés sont un vaste sujet (plusieurs livres y sont dédiés)
Autre précision sur l’Entity Framework, il y a trois approches pour ce qui est de la relation entre modélisation, accès aux données et génération de la base de données :
-Code First : j’écris du code .NET directement qui définira mon modèle et générera directement les scripts de création de ma base.
-Design First : j’utilise l’outil de design de mon modèle (avec ma souris) ce qui générera l’accès aux données et les scripts de création de la base de données.
-Database First : j’ai déjà une base de données existante ou bien un projet de base de données (nous en reparlerons plus tard) dans ma solution et j’extrais ma couche d’accès aux données ainsi que ma modélisation de ce qui a déjà été définit au préalable.
Voici donc mon modèle de données (que vous pouvez quasiment lire comme un modèle de Merise en inversant les cardinalités pour ceux qui ne sont pas familiers avec les EDMX)
Vous noterez que ce modèle comporte des entités qui ont-elles mêmes des propriétés et sont liées entre elles ou non.
Imaginons que mon application soit partie en production, que des clients aient commencé à l’utiliser et que le client me demande d’effectuer des modifications qui vont impacter la structure de la base de données.
Outils de comparaison de schéma de la base
Par exemple je suis amené à effectuer les modifications suivantes :
-Train.HeureDepart : String -> DateTime
-Train.HeureArrivee : String ->DateTime
-Train.Places : Int32 -> Double
-Personne.DateDeNaissance : String -> DateTime
-Ajout d’une table Soda
De telle manière que mon modèle évolue dans ce sens :
J’ai ainsi deux versions de ma base de données, une en production et une en développement que j’aimerais réconcilier afin de pouvoir passer la nouvelle version de mon application en production.
Pour cela cliquez dans Visual Studio sur « données », « comparaison de schémas », « nouvelle comparaison de schémas »
Une fenêtre s’ouvre alors
Il vous est demandé de sélectionner les deux schémas/base de données à comparer, la « source » étant la version la plus récente normalement afin de pouvoir verser les modifications dans la base de données de destination. Notez que vous pouvez effectuer cela d’un projet à un autre (comparaison d’edmx), d’une base de données en ligne à une autre ou d’un fichier de base de données à un autre (ainsi que toutes les combinaisons de ces choix)
Je me connecte donc à gauche à ma base de données de dev et à droite à celle de prod. (PENSEZ BIEN A FAIRE UN BACKUP AVANT DE LA BASE DE PROD) et je clique sur « ok ».
A ce moment Visual Studio lance la comparaison qui peut prendre quelques secondes à plusieurs dizaines de minutes selon la puissance de votre machine, la complexité des bases et la vitesse de connexion à ces dernières.
Une fois la comparaison effectuée vous visualisez un rapport tel que celui-ci qui met en évidence les différences et indique l’action à effectuer, en base vous pouvez voir la différence entre les requêtes de définitions.
Notes : Pensez bien à lire l’intégralité du rapport avant de jouer les modifications, en bas figurent aussi des comparaisons telles que les options de sécurité de la base, les fichiers de logs etc.
Un élément qui comporte directement l’action « ignorer » juste après la génération du rapport est un élément identique sur les deux versions de la base (vous avez un statut plus précis dans la colonne de gauche)
Paramétrez vos mises à jour et cliquez sur «écrire les mises à jour » dans la barre d’outils, notez que si la mise à jour est plus complexe (ex, reprise de données) vous disposez d’un bouton « envoyer les mises à jour à l’éditeur » qui vous permettra de modifier le script de mise à jour avant de le jouer.
Une fois cela effectué, vous pouvez contrôler que tout est correctement effectué en actualisant la comparaison.
Note : sur des modifications plus lourdes (cardinalités entre les tables notamment) il sera préférable de créer une base temporaire, y inscrire le nouveau schéma, y copier les données manuelle avec une requête ou un bout de code afin de conserver la cohérence entre les données.
Note : Cet outil fait partie de la classe « gestion et réingénierie » citée plus haut.
Maintenant que la structure de la base de données est à jour il reste encore une demande du client, celui-ci a en effet des données sur deux instances de l’application (et donc deux instances de la base de données) qu’il voudrait fusionner
Outil génération de données
Dans mon exemple, j’ai utilisé un modèle de données fictif vous l’aurez compris, je n’ai donc pas de données à proprement dit. Je vais donc utiliser entre nos deux étapes principales l’outil de génération de données et vous le présenter (n’êtes-vous pas chanceux ?).
En effet Visual Studio possède un outil de génération de données très utile dans le cadre de tests. Cet outil est en fait un sous outil de ceux fournis dans le cadre d’un projet de base de données.
Mais qu’est-ce que les projets de base de données ? me direz-vous. Les projets de bases de données, comme tout projet Visual Studio permettent la réalisation d’un livrable, ici une base de données au sens large : sa définition (table, vues, schémas, rôles, prog stock, sécurité, stockage…), ses scripts de pré et post déploiement, les plans de génération de données, les plans de reprise de données et les comparaisons.
Il faut bien comprendre que cette approche est une manière différente de créer une base de données que celle que propose l’Entity Framework au travers d’EDMX. Cependant cette approche permet de gérer plus d’options autours de la base de données et de proposer plus d’outils spécifiquement pour la base de données. L’unique « défaut » de cette approche c’est qu’elle ne permet pas de générer une couche d’accès aux données pour l’applicatif que vous allez développer de la même manière que vous le feriez avec l’approche Design First ou Code First sous Entity Framework.
Ces deux méthodologies cohabitent tout de même bien via deux approches :
-Je définis ma base de données depuis l’approche Design First ou Code First de l’Entity Framework et je me sers du projet de base de données comme « fourre-tout » de déploiement et d’instrumentalisation pour ma base.
-Je définis ma base de données au sein de mon projet de base de données et j’utilise l’approche Database First de l’Entity Framework.
Pour créer un nouveau projet de base de données au sein de votre solution effectuez un clic droit sur votre solution dans l’explorateur de solution et cliquez sur « ajouter » puis « nouveau projet », dans la fenêtre qui apparait sélectionnez la section « base de données » à gauche puis « assistant SQL Server 2008 ».
Un assistant de création du projet apparait ensuite, il s’agît d’indiquer dans notre cas que nous traiterons une base de données « classique » (contrairement aux bases qui servent à faire fonctionner SQL Server)
Ainsi que des options relatives à la base de données et à son déploiement
D’indiquer que nous importons une base de données existante (le dernier déploiement de mon EMX dans mon cas)
Et d’indiquer quelques derniers détails à propos du projet qui va être créé.
Une fois le projet créé vous le verrez apparaitre dans l’explorateur de solutions sous cette forme :
Le dossier « Data Generation Plans » contiendra les plans de génération de données (ce qui nous intéresse), « Schema Comparisons » les comparaisons de schémas (nous pourrions enregistrer la comparaison de schéma que nous venons d’effectuer précédemment à cet endroit afin de pouvoir la réutiliser plus tard sans avoir à re-paramétrer des options telles que les connexions aux bases).
Les dossiers « Schema Objects » et « Scripts » contiennent respectivement toute la définition de la base et les scripts de pré et post déploiement. Vous noterez que l’assistant a également créé des objets dans le dossier « Schema Objects » correspondants à la base que nous avons sélectionnée.
Pour créer un plan de génération des données il vous suffit de faire un clic droit sur le dossier « Data Generation Plans », « Ajouter » et « Plan de génération des données ».
Vous aurez devant vous une interface similaire à celle-ci qui vous permettra de gérer le nombre de données à générer ainsi que l’associativité de ces données.
Presser simplement la touche F5 et spécifier la base de données cible pour générer des données et les insérer.
Note : cet outil (génération de données) fait partie de la catégorie « gestion et réingénierie » citée plus haut.
Maintenant que nous avons contrôlé que nos deux bases avaient des schémas identiques et que nous savons qu’elles ont des données différentes que nous devons reprendre, nous allons voir l’outil de comparaison des données.
Note : Si vous voulez aller plus loin dans les projets de base de données et dans la génération de données, n’hésitez pas à consulter ces deux ressources.
http://www.mssqltips.com/tip.asp?tip=2190
http://www.visualstudiotutor.com/2010/08/manage-database-projects-with-visual-studio-2010/
Outil de comparaison de données
Dernière partie de notre article avant la conclusion donc, la comparaison (et l’éventuelle récupération) des données de deux bases de données identiques (du point de vue de leur conception). Notez que la comparaison de données peut ne pas fonctionner sur des tables qui n’ont pas de clefs primaires.
Remarque : les tables sans clefs primaire n’ont lieu d’être que dans certains rares cas, même si on n’a pas le besoin fonctionnel d’une clef primaire il est toujours préférable d’en avoir une sur chacune des tables, ne serait-ce qu’à des fins techniques.
Pour lancer une nouvelle comparaison de données cliquez sur « données », « comparaison de données », « nouvelle comparaison de données ». Une nouvelle fenêtre apparait alors vous demandant de spécifier les connexions aux bases de données source et de destination.
Configurez donc les connexions et cliquez sur « Suivant »
Sélectionnez les éléments à comparer (tables et vues) et cliquez sur « terminer ».
La comparaison des données démarre, cette étape peut prendre quelques secondes à plusieurs dizaines de minutes selon les performances de votre machines, des serveurs SQL, des connexions et selon la charge en cours (à ce propos, évitez d’effectuer des opérations de ce genre aux heures de pointes). Apparait ensuite un rapport sur les différences trouvées entre les jeux de données des deux bases.
Un volet en bas vous permet de voir le détail des enregistrements par table/vue avant d’écrire les mises à jour et tout comme la comparaison de schéma vous avez la possibilité d’écrire les mises à jour et/ou de les envoyer vers l’éditeur ou un fichier. Actualisez ensuite la comparaison pour vous assurer que les données sont à présent identiques.
Note : Cet outil fait partie de la classe « gestion et réingénierie » citée plus haut.
Nous venons donc de voir ce dernier outil très utile qu’est la comparaison de données, passons maintenant à la conclusion.
Conclusion
Nous avons fait un tour rapide des fonctionnalités que Visual Studio offre en matière de données. Ces fonctionnalités simples mais puissantes vous permettent d’être plus efficace dans le travail fastidieux qu’est celui de gérer la cohérence des modèles et des données.
Tip : Les outils de comparaison se coupleront très bien avec un contrôle de code source pour gérer le versionning d’une base de données et de son modèle.
Pour poursuivre votre maitrise de Visual Studio 2010 et des outils fournis je vous conseille de vous documenter sur les outils de tests (et notamment les possibilités qu’ils offrent pour ce qui est « tests des données » et « tests grâce à une source de données »)
Merci pour votre lecture et n’hésitez pas à commenter pour toute remarque, question ou suggestion.
Merci à Benjamin ARKI pour sa relecture et sa correction.
MVP Nomination: One more year as MVP Visual C# !!!
Apr 2nd
I got an email yesterday from Microsoft containing the info that I am awarded Microsoft MVP Visual C# again for 2012. I am very happy and honored for being selected again and proud to call myself MVP for one additional year !!!
I want to take some time and thank my MVP Lead for having me nominated.
Also a big thank you to Microsoft for putting their trust in me. I will do my best and continue sharing my knowledge with the community. So be prepared for many new blog posts and articles in the technical press on Software Architecture & Design, Visual C# and Windows Azure, which are my main interests. I will also continue concentrating on speaking at conferences so I would be glad to see you at any Microsoft events (TechDays, MS Days, etc…).
Stay tuned and continue following me if you like this Blog !
Webcast: Migrate your .NET applications to Windows Azure
Mar 15th
I will present a webcast the 30th of march 2012 with Microsoft in French on how to successfully migrate your .NET applications to Windows Azure entitled “Migrez vos applications .NET sur Windows Azure”.
So if you are interested in this topic and you understand the French language don’t hesitate and inscribe yourself to this free webcast:
TechDays 2012: Videos of my two Azure sessions are now online
Mar 15th
The videos of my two Windows Azure sessions, presented with some colleagues and Microsoft during TechDays 2012, are now online. You can watch them below if you understand the French language.
White Paper in collaboration with Microsoft: Fourth Chapter on How to develop applications for the Cloud
Jan 26th
I am happy to announce that you can find the fourth chapter of a whitepaper on how to develop applications for the Cloud using the Windows Azure platform written by me, François Merand and Laurent Gautier on the official Visual Studio homepage.
http://www.microsoft.com/france/visual-studio/scenarios/developper-pour-le-cloud.aspx
This is the last chapter of the series. We will however continue to finalize and optimize the corresponding application when we find some time. So many additional things to do : ASP.NET MVC 4, IoC, additional abstractions, the implementation of the worker role and the image processing, etc…
You can find the source code of the BDTheque application here.
White Paper in collaboration with Microsoft: Third Chapter on How to develop applications for the Cloud
Jan 24th
I am happy to announce that you can find the third chapter of a whitepaper on how to develop applications for the Cloud using the Windows Azure platform written by me, François Merand and Laurent Gautier on the official Visual Studio homepage.
http://www.microsoft.com/france/visual-studio/scenarios/developper-pour-le-cloud.aspx
We will continue publishing the other chapters in the next weeks so stay tuned as we progress on implementing our example BDTheque application and finalizing our Whitepaper.
You can find the source code of the BDTheque application here.












