Code Monkey home page Code Monkey logo

dotnet / efcore Goto Github PK

View Code? Open in Web Editor NEW
13.5K 13.5K 3.1K 188.64 MB

EF Core is a modern object-database mapper for .NET. It supports LINQ queries, change tracking, updates, and schema migrations.

Home Page: https://docs.microsoft.com/ef/

License: MIT License

Shell 0.18% PowerShell 0.32% C# 99.28% Batchfile 0.01% CMake 0.02% TSQL 0.18% Python 0.01% Visual Basic .NET 0.01%
aspnet-product c-sharp database dotnet-core dotnet-framework dotnet-standard entity-framework hacktoberfest orm

efcore's Introduction

Repository

build status test results

This repository is home to the following .NET Foundation projects. These projects are maintained by Microsoft and licensed under the MIT License.

EF Entity Framework Core

latest version preview version downloads

EF Core is a modern object-database mapper for .NET. It supports LINQ queries, change tracking, updates, and schema migrations. EF Core works with SQL Server, Azure SQL Database, SQLite, Azure Cosmos DB, MySQL, PostgreSQL, and other databases through a provider plugin API.

Installation

EF Core is available on NuGet. Install the provider package corresponding to your target database. See the list of providers in the docs for additional databases.

dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Sqlite
dotnet add package Microsoft.EntityFrameworkCore.Cosmos

Use the --version option to specify a preview version to install.

Daily builds

We recommend using the daily builds to get the latest code and provide feedback on EF Core. These builds contain latest features and bug fixes; previews and official releases lag significantly behind.

Basic usage

The following code demonstrates basic usage of EF Core. For a full tutorial configuring the DbContext, defining the model, and creating the database, see getting started in the docs.

using var db = new BloggingContext();

// Inserting data into the database
db.Add(new Blog { Url = "http://blogs.msdn.com/adonet" });
db.SaveChanges();

// Querying
var blog = db.Blogs
    .OrderBy(b => b.BlogId)
    .First();

// Updating
blog.Url = "https://devblogs.microsoft.com/dotnet";
blog.Posts.Add(
    new Post
    {
        Title = "Hello World",
        Content = "I wrote an app using EF Core!"
    });
db.SaveChanges();

// Deleting
db.Remove(blog);
db.SaveChanges();

Build from source

Most people use EF Core by installing pre-build NuGet packages, as shown above. Alternately, the code can be built and packages can be created directly on your development machine.

Contributing

We welcome community pull requests for bug fixes, enhancements, and documentation. See How to contribute for more information.

Getting support

If you have a specific question about using these projects, we encourage you to ask it on Stack Overflow. If you encounter a bug or would like to request a feature, submit an issue. For more details, see getting support.

Microsoft.Data.Sqlite

latest version preview version downloads

Microsoft.Data.Sqlite is a lightweight ADO.NET provider for SQLite. The EF Core provider for SQLite is built on top of this library. However, it can also be used independently or with other data access libraries.

Installation

The latest stable version is available on NuGet.

dotnet add package Microsoft.Data.Sqlite

Use the --version option to specify a preview version to install.

Daily builds

We recommend using the daily builds to get the latest code and provide feedback on Microsoft.Data.Sqlite. These builds contain latest features and bug fixes; previews and official releases lag significantly behind.

Basic usage

This library implements the common ADO.NET abstractions for connections, commands, data readers, and so on. For more information, see Microsoft.Data.Sqlite on Microsoft Docs.

using var connection = new SqliteConnection("Data Source=Blogs.db");
connection.Open();

using var command = connection.CreateCommand();
command.CommandText = "SELECT Url FROM Blogs";

using var reader = command.ExecuteReader();
while (reader.Read())
{
    var url = reader.GetString(0);
}

Build from source

Most people use Microsoft.Data.Sqlite by installing pre-build NuGet packages, as shown above. Alternately, the code can be built and packages can be created directly on your development machine.

Contributing

We welcome community pull requests for bug fixes, enhancements, and documentation. See How to contribute for more information.

Getting support

If you have a specific question about using these projects, we encourage you to ask it on Stack Overflow. If you encounter a bug or would like to request a feature, submit an issue. For more details, see getting support.

See also

efcore's People

Contributors

ajcvickers avatar andriysvyryd avatar anpete avatar aspnetci avatar brennanconroy avatar bricelam avatar davidfowl avatar dependabot[bot] avatar dotnet-bot avatar dotnet-maestro[bot] avatar dougbu avatar erikej avatar juntaoluo avatar lajones avatar lukewaters avatar marusyk avatar maumar avatar mikary avatar mmitche avatar natemcmaster avatar nschonni avatar ntaylormullen avatar pranavkm avatar ralmsdeveloper avatar roji avatar rowanmiller avatar ryanbrandenburg avatar smitpatel avatar vseanreesermsft avatar wtgodbe avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

efcore's Issues

Rename Git Repos

Based on naming review we decided to rename

  • Data => EntityFramework
  • System.Data.Common => Data.Common
  • Microsoft.Data.SQLite => Data.SQLite

Basic convention-based model builder

Some notes from Rowan on this:

The model you get by having EntityContext infer the model from DbSets and registering the same entity types with ModelBuilder should be the same (i.e. use the same conventions). I think this is very important for the grow up to creating the model externally and passing it in via EntityConfiguration.

More flexible database creation and existence check methods

It is common with some database systems (in particular SQL Azure) to get an empty database provisioned and only create tables. With the current Create and Exists method this situation is not easy to handle, Exists will respond that the database exists but the application cannot use it without the tables.

Create already does both database and table creation but looking at this scenario we are worried about muddying the semantics of Exists (there are are actually very possible variations for checking tables, e.g. it could check if there "any table" or "any table from the model" or even "all tables of the model").

Tentative plan for now is (from Arthur's email):

  • context.Database.Exists => True if database exists regardless of whether it has tables or not
  • context.Database.HasTables => True if database exists and has tables (any tables, not just mapped ones)
  • context.Database.Create => Creates the database but not the tables
  • context.Database.CreateTables => Creates the tables in the database

Then one wrapper method for common case:

  • context.Database.EnsureCreated => Creates the database and tables if necessary

Method names will be revisited, as well support for shared databases scenarios.

Generic base class for Entity failure

Found this issue when trying to use InMemoryDataStore for identity. We have a generic base class for our entities. I modified the existing unit test with an ArtistBase to demonstrate the issue:

Test Name: Can_share_instance_between_contexts_with_sugar_experience
Test FullName: Microsoft.AspNet.Identity.Entity.Test.UserStoreTest.Can_share_instance_between_contexts_with_sugar_experience
Test Source: c:\Github\Identity\test\Microsoft.AspNet.Identity.Entity.Test\UserStoreTest.cs : line 39
Test Outcome: Failed
Test Duration: 0:00:00.284

Result Message: System.InvalidOperationException : Sequence contains no matching element
Result StackTrace:
at System.Linq.Enumerable.Single[TSource](IEnumerable1 source, Func2 predicate)
at Microsoft.Data.Entity.Metadata.EntityMaterializerSource.<>c__DisplayClass3.b__8(IProperty p)
at System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext() at Microsoft.Data.Entity.Metadata.EntityMaterializerSource.BuildDelegate(IEntityType entityType) at Microsoft.Data.Entity.Metadata.EntityMaterializerSource.<>c__DisplayClass0.<GetMaterializer>b__2(Type k) at Microsoft.Data.Entity.Utilities.ThreadSafeDictionaryCache2.GetOrAdd(TKey key, Func2 factory) at Microsoft.Data.Entity.Metadata.EntityMaterializerSource.GetMaterializer(IEntityType entityType) at Microsoft.Data.Entity.ChangeTracking.ClrStateEntry.get_Entity() at Microsoft.Data.InMemory.InMemoryDataStore.<>c__DisplayClass111.b__14(KeyValuePair2 kv) at System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext()
at System.Collections.Generic.List1..ctor(IEnumerable1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at Microsoft.AspNet.Identity.Entity.Test.UserStoreTest.<Can_share_instance_between_contexts_with_sugar_experience>d__6.MoveNext() in c:\Github\Identity\test\Microsoft.AspNet.Identity.Entity.Test\UserStoreTest.cs:line 48
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

    [Fact]
    public async Task Can_share_instance_between_contexts_with_sugar_experience()
    {
        using (var db = new SimpleContext())
        {
            db.Artists.Add(new SimpleContext.Artist { Name = "John Doe" });
            await db.SaveChangesAsync();
        }

        using (var db = new SimpleContext())
        {
            var data = db.Artists.ToList();
            Assert.Equal(1, data.Count);
            Assert.Equal("John Doe", data[0].Name);
        }
    }

    private class SimpleContext : EntityContext
    {
        public EntitySet<Artist> Artists { get; set; }

        protected override void OnConfiguring(EntityConfigurationBuilder builder)
        {
            builder.UseDataStore(new InMemoryDataStore());
        }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            builder.Entity<Artist>().Key(a => a.ArtistId);
        }

        public class Artist : ArtistBase<string>
        {
        }

        public class ArtistBase<TKey>
        {
            public TKey ArtistId { get; set; }
            public string Name { get; set; }
        }
    }

[MusicStore]: Only the identity DB getting created on Coreclr

With the latest bits after this fix: 41e04bb when the app is being run for the first time, EF creates both the data and identity related databases.

Currently EF generates both the DBs if running on Desktop CLR. But with CoreCLR it generates only the identity related db.

Filing a tracking item.

Sporadic failure when running Async query tests

In RelationalConnection there is an assert in the Close method that checks that Open/Close calls are matched. This assert passes most of the time, but sometimes it fails. It looks the failure could be due to a threading issue, possibly related to async query handling. It is also possible that it is a test ordering issue, or an issue in the way DI is creating scoped instances--e.g. getting the same data store object in different scopes.

[MusicStore]: EF fails with an exception on net45

@ajcvickers @rowanmiller - Moving the bug to the product repo. Closing the corresponding bug (aspnet/MusicStore#56) in MusicStore repo.

EF fails with an exception on net45.

:(
Helios failed to start.
The ApplicationStart method threw an exception. Detailed exception information is below.

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.TypeLoadException: Method 'get_Name' in type 'Microsoft.Data.SqlServer.SqlServerDataStoreSource' from assembly 'Microsoft.Data.SqlServer, Version=0.1.0.0, Culture=neutral, PublicKeyToken=null' does not have an implementation.
at Microsoft.Data.Entity.SqlServerEntityServicesBuilderExtensions.AddSqlServer(EntityServicesBuilder builder)
at Startup.<Configuration>b__3(EntityServicesBuilder s) in D:\K\src\MusicStore\src\MusicStore\Startup.cs:line 44
at Microsoft.AspNet.DependencyInjection.EntityServiceCollectionExtensions.AddEntityFramework(ServiceCollection serviceCollection, Action`1 nestedBuilder)
at Startup.<>c__DisplayClass0.<Configuration>b__2(ServiceCollection services) in D:\K\src\MusicStore\src\MusicStore\Startup.cs:line 44
at Microsoft.AspNet.ContainerExtensions.UseServices(IBuilder builder, Action`1 configureServices)
at Startup.Configuration(IBuilder app) in D:\K\src\MusicStore\src\MusicStore\Startup.cs:line 32
--- End of inner exception stack trace ---
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
at Microsoft.AspNet.Hosting.Startup.StartupLoader.<>c__DisplayClass0.<LoadStartup>b__3(IBuilder builder)
at Microsoft.AspNet.Loader.IIS.KlrHttpApplication.HeliosStartupLoaderProvider.WrappingStartupLoader.<>c__DisplayClass0.<LoadStartup>b__2(IBuilder builder)
at Microsoft.AspNet.Hosting.HostingEngine.EnsureApplicationDelegate(HostingContext context)
at Microsoft.AspNet.Hosting.HostingEngine.Start(HostingContext context)
at Microsoft.AspNet.Loader.IIS.KlrHttpApplication.ApplicationStart(IHttpApplication application)
at Microsoft.AspNet.Loader.IIS.HttpApplicationBase.InvokeApplicationStart(IHttpApplication application)

Why do I need System.data reference

In my DbContent
protected override void OnConfiguring(DbContextOptions builder)
{
builder.UseSqlServer(_configuration.Get("Data:DefaultConnection:ConnectionString"));
}

I get compilation errors if I do not have the following reference set in Project.json

"configurations": {
"net45": {
"dependencies": {
}
},

Why do I need this reference?

Custom attributes in edmx (db first)

Currently there is no built-in way to add custom attributes (like for example [Required]) to your entities and properties. It would be awesome if we could define them in the edmx Designer for each property and class.

Query: Calling ICollection<>.Contains() with a sub query with navigations gives incorrect results

Have a query of this shape:

from p in context.Products
where p.OrderDetails.Contains(context.OrderDetails.FirstOrDefault(orderDetail => orderDetail.Discount == 0.1))
select p;

EF will throw an Argument Exception:

System.ArgumentException : The item expression ('{from OrderDetail orderDetail in value(Microsoft.Data.Entity.Query.EntityQueryable1[Northwind.OrderDetail]) where (Convert([orderDetail].Discount) == 0.1) select [orderDetail] => FirstOrDefault()}') is no ConstantExpression, it is a SubQueryExpression. Parameter name: expression at Remotion.Linq.Clauses.ResultOperatorBase.InvokeExecuteMethod(MethodInfo method, Object input) at Remotion.Linq.Clauses.ResultOperatorBase.InvokeGenericExecuteMethod[TInput,TResult](IStreamedData input, Func2 genericExecuteCaller)
at Remotion.Linq.Clauses.ResultOperators.ValueFromSequenceResultOperatorBase.ExecuteInMemory(IStreamedData input)
Query\EntityQueryModelVisitor.cs(430,0): at Microsoft.Data.Entity.Query.EntityQueryModelVisitor.ExecuteResultOperator[TSource,TResult](IEnumerable`1 source, ResultOperatorBase resultOperator, StreamedSequenceInfo streamedSequenceInfo)
at lambda_method(Closure , QuerySourceScope )

AggregateException being thrown in most places

Most exception cases are now throwing an AggregateException with duplicate exceptions.

using Microsoft.Data.Entity;
using Microsoft.Data.InMemory;

namespace ConsoleApplication54
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var db = new MyContext())
            {
                db.Blogs.Add(new Blog { BlogId = 1 });
                db.Blogs.Add(new Blog { BlogId = 1 });
                db.SaveChanges();
            }
        }
    }

    public class MyContext : DbContext
    {
        public DbSet<Blog> Blogs { get; set; }

        protected override void OnConfiguring(EntityConfigurationBuilder builder)
        {
            builder.UseInMemoryStore();
        }
    }

    public class Blog
    {
        public int BlogId { get; set; }
        public string Name { get; set; }
        public string Url { get; set; }
    }
}

System.AggregateException was unhandled
  _HResult=-2146233088
  _message=One or more errors occurred.
  HResult=-2146233088
  IsTransient=false
  Message=One or more errors occurred.
  Source=mscorlib
  StackTrace:
       at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
       at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
       at System.Threading.Tasks.Task`1.get_Result()
       at Microsoft.Data.Entity.DbContext.Add[TEntity](TEntity entity)
       at Microsoft.Data.Entity.DbSet`1.Add(TEntity entity)
       at ConsoleApplication54.Program.Main(String[] args) in c:\Users\rowmil\Documents\Visual Studio 2013\Projects\ConsoleApplication54\ConsoleApplication54\Program.cs:line 13
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: System.InvalidOperationException
       _HResult=-2146233079
       _message=The instance of entity type 'Blog' cannot be tracked because another instance of this type with the same key is already being tracked. For new entities consider using an IIdentityGenerator to generate unique key values.
       HResult=-2146233079
       IsTransient=false
       Message=The instance of entity type 'Blog' cannot be tracked because another instance of this type with the same key is already being tracked. For new entities consider using an IIdentityGenerator to generate unique key values.
       Source=Microsoft.Data.Entity
       StackTrace:
            at Microsoft.Data.Entity.ChangeTracking.StateManager.StartTracking(StateEntry entry)
            at Microsoft.Data.Entity.ChangeTracking.StateEntry.SetEntityState(EntityState entityState, Object generatedValue)
            at Microsoft.Data.Entity.ChangeTracking.StateEntry.<SetEntityStateAsync>d__1.MoveNext()
         --- End of stack trace from previous location where exception was thrown ---
            at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
            at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
            at System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter.GetResult()
            at Microsoft.Data.Entity.DbContext.<AddAsync>d__1`1.MoveNext()
       InnerException: 

Convention-based model builder support for Data Annotations

We should try to support at least the very basic ones, e.g. KeyAttribute for alpha, provided that the DataAnnotations build is ready for K.
Attributes to be implemented:

  • Key
  • Required
  • MaxLength
  • NotMapped
  • ConcurrencyCheck
  • TimeStamp
  • Table
  • Column
  • DatabaseGenerated
  • StringLength

Relationship

  • ForeignKey
  • InverseProperty
  • Required on Navigations

Not supported yet

  • ComplexType

EntityContext Add after a SaveChanges fails

The following unit test which is just trying to Add/Save/Add/Save two artists fails with the error below:

I stepped into the code, and the root issue looks like the second SaveChanges still thinks the first artist is dirty, so it is trying to readd the first artist.

    [Fact]
    public async Task Can_create_two_artists()
    {
        using (var db = new SimpleContext())
        {
            db.Artists.Add(new SimpleContext.Artist { Name = "John Doe", ArtistId = Guid.NewGuid().ToString() });
            await db.SaveChangesAsync();
            db.Artists.Add(new SimpleContext.Artist { Name = "Second guy", ArtistId = Guid.NewGuid().ToString() });
            await db.SaveChangesAsync();
        }
    }

    private class SimpleContext : EntityContext
    {
        public EntitySet<Artist> Artists { get; set; }

        protected override void OnConfiguring(EntityConfigurationBuilder builder)
        {
            builder.UseDataStore(new InMemoryDataStore());
        }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            builder.Entity<Artist>().Key(a => a.ArtistId);
        }

        public class Artist
        {
            public string ArtistId { get; set; }
            public string Name { get; set; }
        }
    }

System.ArgumentException : An element with the same key but a different value already exists.
Result StackTrace:
at System.Collections.Immutable.ImmutableDictionary2.HashBucket.Add(TKey key, TValue value, IEqualityComparer1 keyOnlyComparer, IEqualityComparer1 valueComparer, KeyCollisionBehavior behavior, OperationResult& result) at System.Collections.Immutable.ImmutableDictionary2.AddRange(IEnumerable1 items, MutationInput origin, KeyCollisionBehavior collisionBehavior) at System.Collections.Immutable.ImmutableDictionary2.AddRange(IEnumerable1 pairs, Boolean avoidToHashMap) at System.Collections.Immutable.ImmutableDictionary2.AddRange(IEnumerable1 pairs) at Microsoft.Data.InMemory.InMemoryDataStore.<>c__DisplayClass2.<SaveChangesAsync>b__4(ImmutableDictionary2 db)
at Microsoft.Data.Entity.Utilities.ThreadSafeLazyRef1.ExchangeValue(Func2 newValueCreator)
at Microsoft.Data.InMemory.InMemoryDataStore.SaveChangesAsync(IEnumerable`1 stateEntries, IModel model, CancellationToken cancellationToken)
at Microsoft.Data.Entity.EntityContext.SaveChangesAsync(CancellationToken cancellationToken)
at Microsoft.AspNet.Identity.Entity.Test.UserStoreTest.<Can_create_two_artists>d__c.MoveNext() in c:\Github\Identity\test\Microsoft.AspNet.Identity.Entity.Test\UserStoreTest.cs:line 60

Add extension method on ServiceCollection to register EF services

Following @ajcvickers' suggestion, we're going to expose extension methods from all of the frameworks to do the boilerplate services:

namespace Microsoft.Data.Entity
{
    public static class ServiceCollectionExtensions
    {
        public static ServiceCollection AddEntityFramework(this ServiceCollection services)
        {
            return services.Add(EntityServices.GetDefaultServices());
        }
    }
}

Awesomeness level

EF/E prototype is pretty awesome. This issue is for tracking awesomeness level. Let's aim to make it more awesome by May, and even more (like a baby unicorn) a few months after that.

(Also, first bug.)

Edit: Nope.

LINQ queries that compare related entities should compare based on their keys

I chatted with @divega and he suggested I log a bug. He thinks this may have worked in LINQ to SQL, but perhaps not in EF.

I have two related entities, for example, a photo gallery that contains many photos. In one part of my app I want to write this kind of query:
_db.Photos.Where(p => p.Gallery == gallery)
But apparently the gallery "instance" comparison doesn't work. I have to compare based on the PK value:
_db.Photos.Where(p => p.GalleryId == galleryId)

I'm not sure I'd say this is "hugely" important, but part of me had an expectation that this would work.

Memory leak

Repro:
Clone Music store.
Get data for genre's from the "dbcontext"

repeat,

Memory rapidly goes up (250KB per request or so).


I made sure if you take data out of the picture there is no leak

NullRef thrown if navprop not initialized

I have an Employee with many EmployeePictures. I have to initialize the EmployeePictures property in the Employee constructor or EF will throw a null reference exception when trying to populate it.

Running on SQL Azure might not be supported

I FTP deployed the music store on Azure and try to run it pointing the connection string to SQL Azure database. Below is the error I got when music store database is being initialized.

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.AggregateException: One or more errors occurred. ---> System.Data.SqlClient.SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server) ---> System.ComponentModel.Win32Exception: Access is denied
 --- End of inner exception stack trace ---
 at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
 at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
 at System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean withFailover)
 at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover)
 at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout)
 at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance)
 at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData)
 at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
 at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions)
 at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
 at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
 at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
 at System.Data.ProviderBase.DbConnectionPool.WaitForPendingOpen()
--- End of stack trace from previous location where exception was thrown ---
 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
 at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
 at Microsoft.Data.Entity.Relational.RelationalConnection.<OpenAsync>d__1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
 at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
 at Microsoft.Data.Entity.SqlServer.SqlServerDataStoreCreator.<ExistsAsync>d__1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
 at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
 at MusicStore.Models.SampleData.<InitializeMusicStoreDatabaseAsync>d__1.MoveNext() in D:\home\site\wwwroot\MusicStore\Models\SampleData.cs:line 22

I am not suer, the SQLClient is tested against SQL Azure and if yes, please do let me know the changes I need to make to get this working

Use System.Linq namespace for all async query extension methods

Async query extension methods for IQueryable that return a single element such as FirstAsync() live in System.Linq.QueryableExtensions () and async extension methods on IEnumerable such as ToListAsync() are defined in Microsoft.Data.Entity.Query.AsyncEnumerableExtensions.

This item is to remember trying to have all of them under the System.Linq namespace before we go public.

Support basic set of data types in DDL

From Rowan's notes on this:

The biggest limitation at the moment is that it only handles int, string, decimal, and DateTime. This is primarily about padding out SqlServerMigrationOperationSqlGenerator.GenerateDataType, although Iโ€™m not sure that this is the best place to be filling in underspecified data types as weโ€™ll also need that in the updated and query pipelines.

[Identity blocker] Add/Save Entityuser fails with SqlException

   Microsoft.AspNet.Identity.Entity.Test.UserStoreTest.CanCreateUserUsingEF [FAIL]
      System.AggregateException : One or more errors occurred.\r\n---- System.Data.SqlClient.SqlException : The paramet
rized query '(@p0 nvarchar(4000),@p1 int,@p2 nvarchar(4000),@p3 nvarchar(4000' expects the parameter '@p0', which was n
t supplied.
      Stack Trace:
            at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
            at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
            at System.Threading.Tasks.Task`1.get_Result()
            at Microsoft.Data.Entity.DbContext.SaveChanges()
            at Microsoft.AspNet.Identity.Entity.Test.UserStoreTest.CanCreateUserUsingEF() in C:\GitHub\Identity\test\Mi
rosoft.AspNet.Identity.Entity.Test\UserStoreTest.cs:line 49
         ----- Inner Stack Trace -----
        [Fact]
        public void CanCreateUserUsingEF()
        {
            using (var db = new EFContext())
            {
                if (!db.Database.Exists())
                {
                    db.Database.Create();
                }
                db.Users.Add(new EFUser {UserName = "Foob"});
                db.SaveChanges();
            }
        }

    public class EFContext : DbContext
    {
        public DbSet<EFUser> Users { get; set; }
        //public DbSet<TRole> Roles { get; set; }

        public EFContext(IServiceProvider serviceProvider)
        : base(serviceProvider) { }

        public EFContext() : base() { }

        protected override void OnConfiguring(EntityConfigurationBuilder builder)
        {
            builder.SqlServerConnectionString(@"Server=(localdb)\v11.0;Database=SimpleIdentity1;Trusted_Connection=True;");
        }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            builder.Entity<EFUser>()
                .Key(u => u.Id)
                .Properties(ps => ps.Property(u => u.UserName));
        }
    }

    public class EFUser
    {
        public virtual string Id { get; set; }
        public virtual string UserName { get; set; }
        public virtual string Email { get; set; }
        public virtual int EmailConfirmed { get; set; }
        public virtual string PasswordHash { get; set; }
        public virtual string SecurityStamp { get; set; }
    }

bool not supported in Database.Create

Having a bool property in your poco results in:
public bool Flag { get; set; }

  System.NotSupportedException : Specified method is not supported.
  Stack Trace:
        at Microsoft.Data.SqlServer.SqlServerMigrationOperationSqlGenerator.GenerateDataType(Column column)
        at Microsoft.Data.Migrations.MigrationOperationSqlGenerator.GenerateColumn(Column column, IndentedStringBuil

der stringBuilder)
at Microsoft.Data.Migrations.MigrationOperationSqlGenerator.GenerateColumns(IReadOnlyList1 columns, Indente dStringBuilder stringBuilder) at Microsoft.Data.Migrations.MigrationOperationSqlGenerator.Generate(CreateTableOperation createTableOperati on, IndentedStringBuilder stringBuilder, Boolean generateIdempotentSql) at Microsoft.Data.SqlServer.SqlServerMigrationOperationSqlGenerator.Generate(CreateTableOperation createTabl eOperation, IndentedStringBuilder stringBuilder, Boolean generateIdempotentSql) at Microsoft.Data.Migrations.Model.CreateTableOperation.GenerateSql(MigrationOperationSqlGenerator generator , IndentedStringBuilder stringBuilder, Boolean generateIdempotentSql) at Microsoft.Data.Migrations.MigrationOperationSqlGenerator.<Generate>d__0.MoveNext() at Microsoft.Data.Relational.SqlStatementExecutor.ExecuteNonQuery(DbConnection connection, IEnumerable1 sta
tements)
at Microsoft.Data.SqlServer.SqlServerDataStoreCreator.Create(IModel model)
at Microsoft.Data.Entity.Database.Create()
at Microsoft.AspNet.Identity.Entity.Test.UserStoreTest.<Can_create_two_artists>d__1.MoveNext() in C:\Github\

Foreign key build API is difficult to use

I have an app with a photo gallery model. In its simplest form, there are many galleries, and each gallery has many photos - a rather trivial foreign key relationship (photo.GalleryId ==> gallery.GalleryId).

The builder API for this was a bit challenging to use:

builder.Entity<Photo>().Key(
    p => p.PhotoId).ForeignKeys(
        o => o.ForeignKey<Gallery>(
            p => p.Gallery));

While triple-nested lambdas could be considered #winning, I had to enlist @divega's help to get this typed in ๐Ÿ˜„

(Of course, I concede that I could have just been using it wrong.)

Having multiple statements in a batch causes failure on SQL Azure

When running the music store SQL Azure, creating the database and schema throws the below error

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.AggregateException: One or more errors occurred. ---> System.Data.SqlClient.SqlException: The CREATE DATABASE statement must be the only statement in the batch.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) in C:\Projects\SqlClient\src\Microsoft.Data.SqlServer\System\Data\SqlClient\SqlConnection.cs:line 1147 at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) in C:\Projects\SqlClient\src\Microsoft.Data.SqlServer\System\Data\SqlClient\SqlInternalConnection.cs:line 685
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) in C:\Projects\SqlClient\src\Microsoft.Data.SqlServer\System\Data\SqlClient\TdsParser.cs:line 1197
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) in C:\Projects\SqlClient\src\Microsoft.Data.SqlServer\System\Data\SqlClient\TdsParser.cs:line 2080
at System.Data.SqlClient.SqlCommand.EndExecuteNonQueryInternal(IAsyncResult asyncResult) in C:\Projects\SqlClient\src\Microsoft.Data.SqlServer\System\Data\SqlClient\SqlCommand.cs:line 1479
at System.Data.SqlClient.SqlCommand.EndExecuteNonQueryAsync(IAsyncResult asyncResult) in C:\Projects\SqlClient\src\Microsoft.Data.SqlServer\System\Data\SqlClient\SqlCommand.cs:line 1387
at System.Threading.Tasks.TaskFactory1.FromAsyncCoreLogic(IAsyncResult iar, Func2 endFunction, Action1 endAction, Task1 promise, Boolean requiresSynchronization)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at Microsoft.Data.Entity.Relational.SqlStatementExecutor.d__1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at Microsoft.Data.Entity.SqlServer.SqlServerDataStoreCreator.d__1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at MusicStore.Models.SampleData.d__1.MoveNext() in d:\k\src\MusicStore\src\MusicStore\Models\SampleData.cs:line 44
--- End of inner exception stack trace ---
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
at System.Threading.Tasks.Task.Wait()
at Startup.Configure(IBuilder app) in d:\k\src\MusicStore\src\MusicStore\Startup.cs:line 103
--- End of inner exception stack trace ---
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
at Microsoft.AspNet.Hosting.Startup.StartupLoader.<>c__DisplayClass0.b__4(IBuilder builder)
at Microsoft.AspNet.Loader.IIS.KlrHttpApplication.HeliosStartupLoaderProvider.WrappingStartupLoader.<>c__DisplayClass0.b__2(IBuilder builder)
at Microsoft.AspNet.Hosting.HostingEngine.EnsureApplicationDelegate(HostingContext context)
at Microsoft.AspNet.Hosting.HostingEngine.Start(HostingContext context)
at Microsoft.AspNet.Loader.IIS.KlrHttpApplication.ApplicationStart(IHttpApplication application)
at Microsoft.AspNet.Loader.IIS.HttpApplicationBase.InvokeApplicationStart(IHttpApplication application)

Looks like we need to avoid sending multiple statements in a single batch

Consider adding System.Runtime to Assemblies section of web.config in MVC5 apps

Install EF7 into and MVC5 app and you get the following:

Compilation Error 
  Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately. 

 Compiler Error Message: CS0012: The type 'System.Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.

The workaround is to add this into web.config

  <system.web>
    ...
    <compilation ...>
      <assemblies>
        <add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
      </assemblies>
    </compilation>
  </system.web>

We should look at temporarily adding this by default on package install

"connection's current state is open" exception on operation after using DDL methods

Calling one of the DDL methods (Exists and/or Delete) must be leaving something open with the connection as we get an error when any subsequent database operation is performed.

using Microsoft.Data.Entity;
using Microsoft.Data.SqlServer;

namespace ConsoleApplication54
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var db = new MyContext())
            {
                if(!db.Database.Exists())
                {
                    db.Database.Create();
                }

                db.Blogs.Add(new Blog { Name = "Test", Url = "test.com" });
                db.SaveChanges();
            }
        }
    }

    public class MyContext : DbContext
    {
        public DbSet<Blog> Blogs { get; set; }

        protected override void OnConfiguring(EntityConfigurationBuilder builder)
        {
            builder.SqlServerConnectionString(@"Server=(localdb)\v11.0;Database=MyDatabase;Trusted_Connection=True;");
        }
    }

    public class Blog
    {
        public int BlogId { get; set; }
        public string Name { get; set; }
        public string Url { get; set; }
    }
}
System.AggregateException was unhandled
  _HResult=-2146233088
  _message=One or more errors occurred.
  HResult=-2146233088
  IsTransient=false
  Message=One or more errors occurred.
  Source=mscorlib
  StackTrace:
       at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
       at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
       at System.Threading.Tasks.Task`1.get_Result()
       at Microsoft.Data.Entity.DbContext.SaveChanges()
       at ConsoleApplication54.Program.Main(String[] args) in c:\Users\rowmil\Documents\Visual Studio 2013\Projects\ConsoleApplication54\ConsoleApplication54\Program.cs:line 18
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: System.InvalidOperationException
       _HResult=-2146233079
       _message=The connection was not closed. The connection's current state is open.
       HResult=-2146233079
       IsTransient=false
       Message=The connection was not closed. The connection's current state is open.
       Source=System.Data
       StackTrace:
            at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
            at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
            at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
            at System.Data.SqlClient.SqlConnection.OpenAsync(CancellationToken cancellationToken)
         --- End of stack trace from previous location where exception was thrown ---
            at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
            at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
            at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
            at Microsoft.Data.Relational.RelationalConnection.<OpenAsync>d__1.MoveNext()
         --- End of stack trace from previous location where exception was thrown ---
            at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
            at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
            at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
            at Microsoft.Data.Relational.RelationalDataStore.<SaveChangesAsync>d__1.MoveNext()
         --- End of stack trace from previous location where exception was thrown ---
            at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
            at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
            at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
            at Microsoft.Data.Entity.ChangeTracking.StateManager.<SaveChangesAsync>d__1.MoveNext()
       InnerException: 

Database.Create fails with string primary key

Database.Create fails with an error saying something like column type is not indexable (I can't get the exact error message right now, because of some issue with strong naming)

Basic repro is:

public class User {
    public string Id { get; set; }
}

public class UserContext {
    public DbSet<User> Users { get; set; }
}

var context = new UserContext();
context.Database.Create(); <--- blows up

This worked if I changed the key to int instead.

Rename Nupkgs/Assemblies

Based on naming review we decided to do the following renames:

  • Microsoft.Data.InMemory => Microsoft.Data.Entity.InMemory
  • Microsoft.Data.Migrations => Microsoft.Data.Entity.Migrations
  • Microsoft.Data.Relational => Microsoft.Data.Entity.Relational
  • Microsoft.Data.SQLite.Entity => Microsoft.Data.Entity.SQLite
  • Microsoft.Data.SqlServer => Microsoft.Data.Entity.SqlServer
  • Microsoft.ComponentModel.DataAnnotations => Microsoft.DataAnnotations
  • Microsoft.ComponentModel.DataAnnotations.Core => Microsoft.DataAnnotations.Core
  • Microsoft.ComponentModel.DataAnnotations.Supplemental => Microsoft.DataAnnotations.Supplemental
  • System.Data.Common => Microsoft.Data.Common
  • System.Data.SqlClient => Microsoft.Data.SqlServer

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.