Summary: This document provides basic information about the extension providing Entity Framework support for C#.

Extension ID

com.castsoftware.entity

What's new?

See Entity Framework 2.0 - Release Notes for more information.

Description

This extension provides support for Entity Framework. The calculation of Automated Function Points for your .NET analyses will be supplemented through the links between objects produced by the base .NET Analyzer and database tables, using Entity Framework CRUD operations.

In what situation should you install this extension?

If your .NET application contains Entity Framework source code and you want to view these object types and their links, then you should install this extension. More specifically the extension will identify:

Technology support

Entity Framework

Entity Framework is delivered with the .NET Framework. Therefore the following .NET frameworks are supported by this extension:

Version

Supported

3.0 and above(tick)

Entity Framework Core

Entity Framework Core is supported when using AIP Core 8.3.x and above as Entity Framework Core is delivered with .NET Core.

Version

Supported

3.x

       

2.x(tick)
1.x(tick)

Function Point, Quality and Sizing support

This extension provides the following support:

Function Points
(transactions)
(tick)
Quality and Sizing(tick)

CAST AIP compatibility

This extension is compatible with:

CAST AIP release
Supported
Supported Technology
8.3.x(tick)C#

Supported DBMS servers

This extension is compatible with the following DBMS servers:

DBMSSupported
CSS/PostgreSQL(tick)
Oracle(tick)
Microsoft SQL Server

Prerequisites

(tick)An installation of any compatible release of CAST AIP (see table above)

Download and installation instructions

Include the extension using the interface in AIP Console:

There is nothing further to do. Follow the instructions below to run a new analysis/snapshot to generate new results:

What results can you expect?

Once the analysis/snapshot generation has completed, you can view the results in the normal manner. The following links will be displayed in CAST Enlighten:

Links

Link typeSource and destination of link Methods supported
 useInsertLinkBetween the caller .NET Class / Method objects and Database Table object
  • Add
  • AddAsync
  • AddRange
  • AddRangAsync
  • AddOrUpdate
 useDeleteLinkBetween the caller .NET Class / Method objects and Database Table object
  • Remove
  • RemoveRange
 useUpdateLinkBetween the caller .NET Class / Method objects and Database Table object
  • Update
  • UpdateRange
  • AddOrUpdate
 useSelectLinkBetween the caller .NET Class / Method objects and Database Table object
  • Find
  • FindAsync
  • First
  • FirstOrDefault
  • ToList
  • FirstOrDefaultAsync
  • ToListAsync

Code examples

Insert operation

public void AddNewContractor()        
{
            var contractor = ModelFakes.ContractorFake.Generate();
            var vendor = dbContext.Vendor.FirstOrDefault();
            contractor.VendorId = vendor.Id;
            dbContext.Contractor.Add(contractor);
            dbContext.SaveChanges();
            Assert.AreNotEqual(0, contractor.Id);
}


protected override void Seed(Hth.Aepollon.Data.BackendDataAccess.AepollonContext context)      
{
        var listRefdefaut = context.RefDefauts.ToList();
                foreach (var refDef in listRefdefaut)
                {
                    context.MatriceDemerits.AddOrUpdate(
                        new MatriceDemerit { idModeOperatoire = 1, idRefDefaut = refDef.idRefDefaut, idTailleDefaut = 1,
                                             PointsDemerit = 1, PointsDemeritLineaire = 1, Tare = (decimal)0.05 },
                        new MatriceDemerit { idModeOperatoire = 1, idRefDefaut = refDef.idRefDefaut, idTailleDefaut = 2,
                                             PointsDemerit = 3, PointsDemeritLineaire = 3, Tare = (decimal)0.20 },
                        new MatriceDemerit { idModeOperatoire = 1, idRefDefaut = refDef.idRefDefaut, idTailleDefaut = 3,
                                             PointsDemerit = 5, PointsDemeritLineaire = 5, Tare = (decimal)0.50 });
                }
                context.SaveChanges();           
}


Delete operation

public void RemoveEntry()        
{
            var rec = dbContext.Contractor.FirstOrDefault();
            dbContext.Contractor.Remove(rec);
            dbContext.SaveChanges();
}

Update operation

public void UpdateContractorAddress()        
{
            var contractor = dbContext.Contractor.FirstOrDefault();
            contractor.Address = ModelFakes.ContractorFake.Generate().Address;
            dbContext.Contractor.Update(contractor);
            dbContext.SaveChanges();
}         

Select operation

public void FindEntry(int id)        
{
            var rec = dbContext.Vendor.Find(id);
            dbContext.SaveChanges();        
}

LINQ-To-Entities

public static void LinqToEntitiesQueries()
{
         using (var context = new SchoolDBEntities())
         {
		    //Retrieve students whose name is Bill - Linq-to-Entities Query Syntax
                var students = (from s in context.Students
                                where s.StudentName == "Bill"
                                select s).ToList();
                //Retrieve students with the same name - Linq-to-Entities Method Syntax
                var studentsWithSameName = context.Students
                        .GroupBy(s => s.StudentName)
                        .Where(g => g.Count() > 1)
                        .Select(g => g.Key);
          }
}

Support for EntityModelConfiguration

EntityModelConfiguration allows configuration to be performed for any entity type in a model. Support has be been provided to create links between method and table,  when table name is overridden through EntityModelConfiguration.


public DomainModel.Portaalstatus OpslaanLogin(Account account)        
{
            using (new LoggingMonitoredScope(LogConstants.Diagnostics))
            {
                ValidationHelper.Validate(account);
                if (ClaimHelper.IsMeekijker())
                    return new DomainModel.Portaalstatus();
                var cacheKey = CacheSettingsHelper.CreateCacheKey(account);
                                _cacheHelper.Remove(cacheKey, CacheGroups.CacheGroupPortaalStatussen);
                DomainModel.Portaalstatus cacheItem;
                using (var dbContext = new ApfPortalenDbContext())
                {
                    var portaalstatus =
                        dbContext.Portaalstatussen.FirstOrDefault(
                            p => p.AdministratieId.Equals(account.AdministratieIdentificatie) &&
                                 p.RelatienummerDeelnemerMaia.Equals(account.RelatienummerDeelnemerMAIA));
		    if (portaalstatus == null)
                    {
                        portaalstatus = dbContext.Portaalstatussen.Add(new Portaalstatus());
		    }
		}; 
                   
}


Evolution

Assumptions

Limitations