如果我使用Database First,如何使我的上下文对象使用Entity Framework 5.0中的Enum功能.
我基于现有数据库创建了一个实体框架模型,然后从模型中生成了POCO实体.我的web.config中的连接字符串不是实体框架,它只是标准连接字符串(它缺少CSDL,SSDL,MSL引用).
我可以编译我的应用程序,但是当我运行时,我收到此错误:
如果在Code First模式下使用,使用T4模板为Database First和Model First开发生成的代码可能无法正常工作.要继续使用Database First或Model First,请确保在执行应用程序的配置文件中指定了Entity Framework连接字符串.要使用从Database First或Model First生成的这些类,使用Code First添加任何其他配置,使用属性或DbModelBuilder API,然后删除引发此异常的代码
我的问题是,在我的代码中,它实现了POCO来自自动生成,我怎样才能让它像Code First一样?我不想在我的连接字符串中引用CSDL等.
c# entity-framework code-first entity-framework-4.1 database-first
如您所知,最新版本的Visual Studio 2017放弃了'project.json' .csproj而是使用了它.
我正在使用RTM版本,并希望按照本指南从现有数据库生成模型.我在最后一步遇到错误:
Package Manager控制台的Entity Framework Core命令尚不支持基于csproj的.NET Core项目.请改用.NET命令行工具(即dotnet ef).有关详细信息,请参阅https://go.microsoft.com/fwlink/?linkid=834381.
发生错误后,我使用了它提到的链接切换到dotnet ef.这是我的包管理器命令:
PM> dotnet ef dbcontext scaffold"Server =.; Database = Jumpstart; Trusted_Connection = True;" Microsoft.EntityFrameworkCore.SqlServer
然后错误再次出现:
dotnet:找不到匹配命令"dotnet-ef"的可执行文件
我使用了help命令,发现dotnet没有名为ef的命令.
我只想从现有数据库生成模型.
我在数据库中的表中添加了一个新列.该表已在现有的Entity Framework模型中定义.我已经完成了大部分关于如何做到这一点的项目,但它仍然失败了.
有一点背景,这个实体模型至少在3年内没有更新.所以除了我要添加的列之外,我知道在那段时间里已经添加了许多其他列,但从未包括在内.我大约9个月前接手了这个项目,但从未能成功更新模型.
第一次尝试:
结果:
第二次尝试
结果
第三次尝试
结果
第四次尝试
结果
最后的尝试
结果
我将非常感激任何可以提供的帮助或方向,因为我处于关键时刻并且必须更新模型.
我首先使用EF 4数据库+ POCO.因为EF没有简单的方法来声明传入的DateTimes是种类的UTC,所以我将属性从自动生成的文件移动到另一个文件中的部分类.
private DateTime _createdOn;
public virtual System.DateTime CreatedOn
{
get { return _createdOn; }
set
{
_createdOn =
(value.Kind == DateTimeKind.Unspecified)
? _createdOn = DateTime.SpecifyKind(value, DateTimeKind.Utc)
: value;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,现在每次更新模型时,都会在T4代中再次创建自动化属性.当然这会导致以下编译错误:"类型'Foo'已包含'CreatedOn'的定义".
有没有办法告诉EF不生成该属性并让我自己处理它?
更新
谢谢大家的答案......
我创建了一个具有不同名称的新自定义属性.
public virtual System.DateTime CreatedOnUtc
{
get
{
return (CreatedOn.Kind==DateTimeKind.Unspecified)
? DateTime.SpecifyKind(CreatedOn, DateTimeKind.Utc)
: CreatedOn;
}
set
{
CreatedOn =
(value.Kind == DateTimeKind.Unspecified)
? CreatedOn = DateTime.SpecifyKind(value, DateTimeKind.Utc)
: value;
}
}
Run Code Online (Sandbox Code Playgroud)
我还将自动生成属性的所有setter和getter设置为Private,但我需要在Linq-to-Entities查询(叹气)中使用这些属性.在这些情况下,我将这些吸气剂设置为内部.
我确定希望在DateTime类型上有一个下拉列表,指定EF应该将其视为DateTime的"种类".这样可以节省数小时和额外的复杂功能.
我有几个数据库,它们的架构是相同的.当我使用数据库优先时,在创建edmx文件时指定连接字符串.我想知道,有没有办法改变连接字符串?这是,所以我可以选择要运行的数据库.Thx提前!
我正在使用mvc 4,首先使用数据库.
每次刷新model.edmx文件时,都会删除我添加的显示名称属性.如何在刷新之间保持显示名称属性?
我正在启动一个必须使用现有数据库的新应用程序,该数据库使用一些在.net中非常烦人的命名约定(表名以几个指定表的业务域的三元组开头,列名以表trigram开头,三元组是大写的,由下划线等分隔,).
我想做的是编写一个简单的重命名规则(这很简单,就像找到最后一个下划线并在此之后采取一切)并将其应用于实体框架中.我真的不想在编辑器中逐个编辑名称,特别是因为数据库可能会改变,我不想多次这样做.
我正在使用Database First(因为数据库已经存在并且它是"主")和EF 4.x DbContext Generator,它开箱即用(虽然命名很糟的类和属性).
我编辑了T4模板以重命名生成的实体和属性,但是当我尝试执行任何请求时,DbContext对象找不到与我尝试请求的实体匹配的表,并且我得到了以下异常:
实体类型[实体名称]不是当前上下文的模型的一部分.
这显然是为什么它没有找到表:没有什么告诉它如何匹配实体名称和表,因为我在运行中更改它.我读到我可以在OnModelCreating(DbModelBuilder modelBuilder)方法中添加指令,但这不在Database First中使用(默认的T4模板在其中添加了一个例外,以防万一).
所以现在我卡住了,我不知道如何指定匹配.
以下是我的几个想法,但不确定它是否正确或可行:
任何的想法 ?还是我错过了什么?
c# entity-framework entity-framework-4 database-first ef-database-first
我正在使用EF 4.1,我创建了一个普通的EF edmx文件.我是从DB生成的.
当它生成时,我右键单击并选择添加代码生成项,生成新类,然后使用DbContext.我使用模板DbContext生成器.
一切正常.
然后我trie查询上下文:
using (var context = new PasDBEntities())
{
var client=context.ClientCompanies.SingleOrDefault(_=>_.ID==clientCompanyId);
if(client!=null)
Run Code Online (Sandbox Code Playgroud)
我在创建上下文的新实例时没有问题但是当我尝试查询它时会出现问题.我陷入了UnintentionalCodeFirstException.并得到错误:
{"如果在Code First模式下使用,则使用T4模板为Database First和Model First开发生成的代码可能无法正常工作.要继续使用Database First或Model First,请确保在执行应用程序的配置文件中指定了Entity Framework连接字符串要使用从Database First或Model First生成的这些类,使用Code First添加任何其他配置,使用属性或DbModelBuilder API,然后删除引发此异常的代码."}
我不想先使用代码,但我不知道是否可以"关闭"它,或者问题出在哪里.
供参考,这是我的构造函数......
public partial class PasDBEntities : DbContext
{
public PasDBEntities()
: base("PasDBEntities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
Run Code Online (Sandbox Code Playgroud)
...和连接字符串:
<connectionStrings>
<add name="PasDBEntities"
connectionString="metadata=res://*/PasDB.csdl|
res://*/PasDB.ssdl|
res://*/PasDB.msl;
provider=System.Data.SqlClient;
provider connection string="
data source=localhost;
initial catalog=PasDB;
integrated security=True;
pooling=False;
multipleactiveresultsets=True;
App=EntityFramework""
providerName="System.Data.EntityClient" />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud) entity-framework connection-string entity-framework-4.1 database-first
我有一个数据库,其中包含一个带有2列主复合键的表(一个int,一个bigint.)我有两个具有复合外键的表,引用第一个表的复合主键.(就我所知,)数据库本身的关系很好,很花哨.
通过DB-first EF6生成DB上下文时,这些关系/导航属性不会在生成的模型中表示(两个子表中没有虚拟成员引用父表.)
由于它是db-first,我无法修改模型.
entity-framework composite-key database-first ef-database-first entity-framework-6