(这曾经是一个由两部分组成的问题,但由于第二部分确实是重要的部分,我决定将其拆分为两个单独的帖子.请参阅使用序列化在第二部分的实体框架中的两个ObjectContexts之间复制实体.
我想为我的实体模型创建一个相当通用的"克隆"数据库.此外,我可能需要支持不同的提供商等.我正在使用ObjectContextAPI.
我已经知道这个问题和EntityConnectionStringBuilder MDSN文档示例,但是我需要知道是否有一种编程方式来获取值以初始化Provider和Metadata属性EntityConnectionStringBuilder?
using (var sourceContext = new EntityContext()) {
var sourceConnection = (EntityConnection) sourceContext.Connection;
var targetConnectionBuilder = new EntityConnectionStringBuilder();
targetConnectionBuilder.ProviderConnectionString = GetTargetConnectionString();
targetConnectionBuilder.Provider = "System.Data.SqlClient"; // want code
targetConnectionBuilder.Metadata = "res://*/EntityModel.csdl|res://*/EntityModel.ssdl|res://*/EntityModel.msl"; // want code
using (var targetContext = new EntityContext(targetConnectionBuilder.ConnectionString)) {
if (!targetContext.DatabaseExists())
targetContext.CreateDatabase();
// how to copy all data from the source DB to the target DB???
} …Run Code Online (Sandbox Code Playgroud) 我正在使用Database First和Entity Framework 5.我们有两个表(大规模简化):
当我们使用Visual Studio将数据库导入EF("从数据库更新模型")时,我们最终得到如下代码:
Customer myCustomer;
var a = myCustomer.Address;
var b = myCustomer.Address1;
var c = myCustomer.Address2;
Run Code Online (Sandbox Code Playgroud)
我想要的显然是这样的:
var a = myCustomer.BillingAddress;
var z = myCustomer.BillingAddress.Street; // etc.
Run Code Online (Sandbox Code Playgroud)
我可以在设计器中编辑模型,更改导航属性以给我正确的名称.但是,这不是一个可行的解决方案,因为我们每次更改数据库时都会重建模型.
我尝试过的一个选项是创建一个像这样的部分类(从现有的MyModel.Designer.cs复制的代码,只更改了属性名):
public partial class Customer : EntityObject
{
[EdmRelationshipNavigationPropertyAttribute("MyModel", "FK_Customers_Addresses_BillingAddress", "Address")]
public Address BillingAddress
{
get {
return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<LookupItem>("MyModel.FK_Customers_Addresses_BillingAddress", "Address").Value;
}
set {
((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<LookupItem>("MyModel.FK_Customers_Addresses_BillingAddress", "Address").Value = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我运行它时,我收到以下错误:
概念类型"MyModel.Customer"中的成员数与对象端类型"MyNamespace.DataModel.Customer"上的成员数不匹配.确保成员数量相同.
我已经尝试使用[NotMapped()]属性,但这没有任何区别.如果我删除[EdmRelationshipNavigationPropertyAttribute ...]属性,那么Linq会抱怨以下错误:
LINQ to Entities不支持指定的类型成员'BillingAddress'.仅支持初始值设定项,实体成员和实体导航属性.
有没有其他方法可以在Customers对象中实现有意义的名称?
这就是我最终想要的东西:
var …Run Code Online (Sandbox Code Playgroud) 我首先使用Visual Studio 2012与实体框架5模型.我想使用每个层次结构策略的表生成我的数据库,但找不到该选项.实体设计器数据库生成Power Pack不适用于visual studio 2012,或者我找不到它.
有人建议吗?
我正在使用Entity Framework 5.0,其中包含代码优先方法以及由Table Per Hierarchy表示的业务对象的继承.
我想要有以下结构:
//Assembly 'DataAccess'
public class MyDbContext : DbContext
{
DbSet<AbstractClass> CommonObjects.AbstractClasses { get; set; }
}
//Assembly 'CommonObjects'
public abstract class AbstractClass
{
//implementation
}
//Assembly 'DerivedObjects'
public class DerivedClass : AbstractClass
{
//implementation
}
Run Code Online (Sandbox Code Playgroud)
在运行时,第一次尝试访问DbContext时,编译器会抛出InvalidOperationException:
抽象类型"CommonObjects.AbstractClass"没有映射的后代,因此无法映射.从模型中删除"CommonObjects.AbstractClass",或者将从"CommonObjects.AbstractClass"派生的一个或多个类型添加到模型中.
这种情况甚至可能吗?如果是的话,我做错了什么?
感谢您提前的答案.
本
附加信息:
也许我应该更具体一点:
我有一个包含我的抽象业务对象的程序集(只有抽象).具体实现(包含逻辑)保存在负责的程序集中,因为它们的逻辑依赖于该程序集中的其他类.问题是,我希望能够在persistance层中存储这些conrete实现.但为此目的,EF必须知道这些类型才能实现映射.但我不想让持久层依赖于我的业务逻辑层 - 只有抽象.
这就是我尝试直接从业务对象层将派生对象添加到DbContext的原因.
例:
AbstractClass derivedClass = new DerivedClass();
MyDbContext.AbstractClasses.Add(derivedClass);
Run Code Online (Sandbox Code Playgroud)
但随后抛出上述例外情况.我只是想不出一个好的结构来实现这一目标.
inheritance entity-framework table-per-hierarchy entity-framework-5
我想知道Entity Framework的迁移是否有可能让sql脚本创建我的数据库的内容,包括Configuration类中seed方法的所有数据:
protected override void Seed(Sotasa.DAL.SqlContext context)
{
//Data I'd like to be included to the script
}
Run Code Online (Sandbox Code Playgroud)
Update-Database命令的帮助看起来不像是这样:
Update-Database [-SourceMigration <String>] [-TargetMigration <String>] [-Script] [-Force] [-ProjectName <String>] [-StartUpProjectName
<String>] [-ConfigurationTypeName <String>] -ConnectionString <String> -ConnectionProviderName <String> [<CommonParameters>]
Run Code Online (Sandbox Code Playgroud) entity-framework ef-code-first ef-migrations entity-framework-5
假设我有一个名为1的数据库Products.因此,我将通过Db First方法在VS 2012中创建一个带有pluralize and singularize选项的EF模型.
因此,模型Product为我创建了一个实体,默认命名约定将此实体映射到dbo.Products表.
现在我想改变这种行为.实际上我想创建一个自定义约定来将ProductModel实体映射到dbo.Products表.
这可能吗?!如果是这样,怎么样?
更新:我的目标是......
如您所知,每当您从数据库更新模型时,如果它导致模型发生更改,则自动生成的实体将被覆盖.
另一方面,我想将数据注释属性添加到实体属性,以便我可以使用它们来塑造我的视图,并希望简单地使用我的DbContext,如下面的插入:
public ActionResult Create(Product product)
{
if (ModelState.IsValid)
{
db.Products.Add(product);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(product);
}
Run Code Online (Sandbox Code Playgroud)
问题是我的应用程序分析没有完成,数据库更改次数.因此,我需要从数据库更新模型,之后,我的所有属性都将被删除.
所以我决定创建一个ProductModel类并将Product代码复制到它,并将视图作为视图模型传递给它.然后,当我想查询我的数据库时,我会得到一个异常,它说该dbo.ProductModels名称在db中不存在...
提前致谢
entity-framework naming-conventions asp.net-mvc-4 entity-framework-5
我有一个包含非常大的表的数据库(其中一些可能有超过1,000,000条记录),并且该数据库的每个用户都应该看到一些这样的数据,因此我们有多个获得用户ID的TVF(表值函数)并选择那些该用户可见的表的记录(此操作需要多个SELECT语句,我认为调用TVF远比在代码中实现它好得多).在我的客户程序的第一个版本中,我有一个类IQueryable,它具有使用LinqToSql实现的多个类型的属性,并且它工作得很好.现在我有一个客户端想要使用我的程序集来编写WCF数据服务,所以我必须编写一个派生自DbContext(使用EF)的类,可以在指定的服务中使用.我的问题是:
DbContext自动公开DbSet其中定义的所有属性,因此每个具有最低访问级别的用户都可以看到表的整个数据(当然客户端应用程序将限制数据,但客户端可以直接访问数据,甚至可以将这些数据导入到Excel或Access中的OData)
我有多个类型的公共属性,IQueryable但它们不会出现在WCF数据服务公开的数据列表中.
为了解决这个问题,我认为最完整的解决方案是能够将TVF称为表并从中创建一个集合.但我不知道该怎么做?!
注意 对数据库的任何更改都需要一些日志记录,因此我有存储过程来执行这些更改,因此我只需要对我的WCF数据服务的只读访问权限,并且我不希望默认设置包含在表中发布的表的所有记录.服务
出于某种原因,微软决定不支持EF5中的简单连接.
例如
Select(foo => new
{
someProp = "hello" + foo.id + "/" + foo.bar
}
Run Code Online (Sandbox Code Playgroud)
如果foo.id或foo.bar是数字,这将抛出.
我发现的解决方法显然是代码:
Select(foo => new
{
someProp = "hello" +
SqlFunctions.StringConvert((double?)foo.id).Trim() +
"/" +
SqlFunctions.StringConvert((double?)foo.bar).Trim()
}
Run Code Online (Sandbox Code Playgroud)
哪个工作正常,但看起来很可怕.
那么,有更好的方法来实现这个更清洁的代码吗?我对这个客户端不感兴趣,所以没有.AsEnumerable()请回答.
数据库在SQL Server 2005中,我所讨论的列的数据类型定义为tinyint(我无法更改此类型)
我创建了一个类型为的模型Int32.在read语句系统中抛出此错误.
无法将属性设置为字节值,必须将该属性设置为int32类型的非null
我遇到了其他类型的类似问题,然后在检查CLR映射后我更正了它们.现在我只在tinyint和的情况下面对这个问题smallint.
好吧,我完全被这个困扰了.我可能没有足够的信息在这里发布,但我甚至不知道从哪里开始寻找.我正在尝试在DAL.edmx文件上"从数据库更新模型".我将一个字段包含在之前未包含的视图中.我尝试刷新,然后我尝试重命名数据库中的视图并从DAL中删除视图,以便我可以重新添加它.我有两次
接下来,我无缘无故地尝试将我重命名的视图添加到DAL中,得到了相同的异常.从DAL.tt手动删除没有帮助.谷歌搜索问题,只有2个不相关的结果.我不知道哪里开始寻找.
我没有写它,但这里是视图的源sql(如果它有帮助).EF不会添加重命名的视图这一事实暗示它可能与SQL有关吗?SQL在mngmnt studio中运行正常.
SELECT ID, IssueID, IssueTypeID, IssueText, IssueCreateDate, WeekendDate, CustomerName, Employee,
CONVERT(DECIMAL(6, 2), AdjustedTotalRHours, 101) AS AdjustedTotalRHours, AdjustedTotalOHours,
AdjustedTotalRHours + AdjustedTotalOHours AS Hours, InvoiceNumber, AdjustedInvoiceAmount,
COALESCE
((SELECT SUM(InvoiceAmount) AS Expr1
FROM TrendingDataFinal AS I1
WHERE (InvoiceNumber = T1.InvoiceNumber) AND (CompanyID = T1.CompanyID) AND
(CalType = 'F') AND (Aident = T1.Aident)), 0) AS TotalInvoiceAmount, InvoiceDate,
ROUND(DATEDIFF(DAY, InvoiceDate, GETDATE()), 0) AS DaysOutstanding, Notes, Aident, EINC, IsClosed,
CompanyID,
(SELECT COUNT(ne.EntryID) AS Expr1
FROM Madison.Notes.Note AS n INNER JOIN
Madison.Notes.NoteEntry AS ne …Run Code Online (Sandbox Code Playgroud)