您好我有多个项目连接到CodeFirst Entity Framework的某个数据库。
除了一个顽固的项目外,所有项目都能成功连接。
我得到的错误是:$invoice_date = date('Y-m-d H:i:s');
我查看了无数的stackoverflow问题,mysql论坛,实体框架论坛等,包括:
MappingException Edm.String not compatable with SqlServer.varbinary
Keyword not supported in MySQL's connection string
Keyword not supported: 'metadata' + MySQL
我的连接字符串如下所示:
Keyword not supported: 'port'
我的db.cs文件如下:
server=myservername;port=3306;uid=myaccount;database=mydb;pwd=mypwd123
当我从连接字符串中删除public partial class MyDB : DbContext
{
public MyDB ()
: base("server=myservername;port=3306;uid=myaccount;database=mydb;pwd=mypwd123")
{
Logger.Trace("test123");
}
public virtual DbSet<MyItem> MyItems {
get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<MyItem>()
.Property(e => e.Content)
.IsUnicode(false);
}
}
时,我得到了这个:
port:3306
我正在使用MySql Connector而不是Sql Server ......
我和我的团队其他成员完全不相信。
编辑: 这是我的Web.Config
System.Data.Entity.Core.MappingException: Schema specified is not valid. Errors:
(8,12) : error 2019: Member Mapping specified is not valid. The type 'Edm.DateTime[Nullable=False,DefaultValue=,Precision=]' of member 'Time' in type 'something.Model.MyItem' is not compatible with 'SqlServer.timestamp[Nullable=False,DefaultValue=,MaxLength=8,FixedLength=True,StoreGeneratedPattern=Identity]' of member 'time' in type 'CodeFirstDatabaseSchema.MyItem'.
at System.Data.Entity.Core.Mapping.StorageMappingItemCollection.Init(EdmItemCollection edmCollection, StoreItemCollection storeCollection, IEnumerable`1 xmlReaders, IList`1 filePaths, Boolean throwOnError)
at System.Data.Entity.Core.Mapping.StorageMappingItemCollection..ctor(EdmItemCollection edmCollection, StoreItemCollection storeCollection, IEnumerable`1 xmlReaders)
at System.Data.Entity.ModelConfiguration.Edm.DbDatabaseMappingExtensions.ToStorageMappingItemCollection(DbDatabaseMapping databaseMapping, EdmItemCollection itemCollection, StoreItemCollection storeItemCollection)
at System.Data.Entity.ModelConfiguration.Edm.DbDatabaseMappingExtensions.ToMetadataWorkspace(DbDatabaseMapping databaseMapping)
at System.Data.Entity.Internal.CodeFirstCachedMetadataWorkspace..ctor(DbDatabaseMapping databaseMapping)
at System.Data.Entity.Infrastructure.DbCompiledModel..ctor(DbModel model)
at System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext)
at System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input)
at System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext()
at System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName)
at System.Data.Entity.Internal.Linq.InternalSet`1.Add(Object entity)
at System.Data.Entity.DbSet`1.Add(TEntity entity)
at MyFunction(Int32 userId, String id, String type, String contentJsonString) in
答案 0 :(得分:7)
使用的基础DbContext
constructor的参数称为nameOrConnectionString
。因此,它支持配置文件中的连接字符串的名称,或者在您的情况下支持实际的连接字符串。
后者的问题是它不允许指定提供商名称,因为前者来自配置,在这种情况下,EF使用defaultConnectionFactory
中指定的那个配置元素,在您的情况下是System.Data.Entity.Infrastructure.SqlConnectionFactory
,换句话说 - Sql Server ,因此port
不支持异常。
有几种方法可以解决这个问题。
(A)更改defaultConnectionFactory
配置:
<defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6"></defaultConnectionFactory>
(B)使用命名配置连接字符串并明确指定提供者:
<connectionStrings>
<add name="MyDB" providerName="MySql.Data.MySqlClient" connectionString="server=myservername;port=3306;uid=myaccount;database=mydb;pwd=mypwd123" />
</connectionStrings>
并将构造函数更改为
public MyDB()
{
// ...
}
或者名称与您的DbContext
派生类名称不同:
public MyDB() : base(connection_string_name)
{
// ...
}
(C)使用DbConfigurationTypeAttribute
:
[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public class MyDB : DbContext
{
// ...
}
答案 1 :(得分:3)
答案 2 :(得分:1)
有时候这是最简单的事情。当我错过连接字符串开头的“ Server =”时,我的一个复制粘贴错误。
答案 3 :(得分:0)
使用ASP.net核心和数据库时出现类似于上面列出的错误。具有ASP.net核心的默认数据库提供程序是SQL Server,但是,如果您使用的是其他提供程序,例如PostgreSQL,并且未在startup.cs中正确编写或配置DBContext代码
例如 - 下面的代码是为了连接到PostgresSQL而写的,那么它将导致错误 ArgumentException:不支持关键字:'port'。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
var connection = @"Server=localhost;Port=5432;Database=NewDB;User Id=xxxxx;Password=cr@aaaa;";
services.AddDbContext<BloggingContext>(options => options.UseSqlServer(connection));
// ...
}
原因是用户正在尝试连接到PostgreSQL,但在配置PostgreSQL字符串后确实更改了默认的Option UseSQLServer。
要解决此问题,请更改选项
options.UseSqlServer(connection)) - &gt; options.UseNpgsql(连接))
答案 4 :(得分:0)
我使用MySql Connector 8.0.x并按照以下链接上的说明https://davidsekar.com/asp-net/mysql-error-the-provider-did-not-return-a-providermanifesttoken彻底解决了问题。
详细信息:
安装MySql.Data.EntityFramework。不要安装Install MySql.Data.Entity!
以这种方式配置web.config / app.config:
2.1。将<entityFramework>
标记更改为<entityFramework codeConfigurationType="MySql.Data.EntityFramework.MySqlEFConfiguration, MySql.Data.EntityFramework">
2.2。添加/更改提供程序。它必须是:<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.EntityFramework" />
2.3。现在,连接字符串可以为server=myservername;port=3306;uid=myaccount;database=mydb;pwd=mypwd123
打开DbContext的配置类(如果存在),并将以下代码放入其构造函数中:
SetSqlGenerator("MySql.Data.MySqlClient" new MySql.Data.EntityFramework.MySqlMigrationSqlGenerator());