标签: entity-framework-5

实体框架中的"克隆"EntityConnections和ObjectContexts

(这曾经是一个由两部分组成的问题,但由于第二部分确实是重要的部分,我决定将其拆分为两个单独的帖子.请参阅使用序列化在第二部分的实体框架中的两个ObjectContexts之间复制实体.

我想为我的实体模型创建一个相当通用的"克隆"数据库.此外,我可能需要支持不同的提供商等.我正在使用ObjectContextAPI.

我已经知道这个问题EntityConnectionStringBuilder MDSN文档示例,但是我需要知道是否有一种编程方式来获取值以初始化ProviderMetadata属性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)

.net c# entity-framework .net-4.5 entity-framework-5

5
推荐指数
1
解决办法
467
查看次数

如何将导航属性名称更改为有意义的名称

我正在使用Database First和Entity Framework 5.我们有两个表(大规模简化):

  • 地址
    • 镇(等)
  • 顾客
    • 名称
    • 帐单地址
    • 邮寄地址
    • AltDeliveryAddress

当我们使用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)

c# entity-framework ef-database-first entity-framework-5

5
推荐指数
2
解决办法
6520
查看次数

如何使用实体框架5模型首先生成每个层次结构的表

我首先使用Visual Studio 2012与实体框架5模型.我想使用每个层次结构策略的表生成我的数据库,但找不到该选项.实体设计器数据库生成Power Pack不适用于visual studio 2012,或者我找不到它.

有人建议吗?

table-per-hierarchy entity-framework-5 ef-model-first

5
推荐指数
1
解决办法
688
查看次数

Entity Framework 5.0继承多个程序集

我正在使用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

5
推荐指数
0
解决办法
646
查看次数

获取脚本来创建数据库,包括初始化数据

我想知道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

5
推荐指数
1
解决办法
4704
查看次数

如果EF 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

5
推荐指数
1
解决办法
842
查看次数

从实体框架中的表值函数创建集合

我有一个包含非常大的表的数据库(其中一些可能有超过1,000,000条记录),并且该数据库的每个用户都应该看到一些这样的数据,因此我们有多个获得用户ID的TVF(表值函数)并选择那些该用户可见的表的记录(此操作需要多个SELECT语句,我认为调用TVF远比在代码中实现它好得多).在我的客户程序的第一个版本中,我有一个类IQueryable,它具有使用LinqToSql实现的多个类型的属性,并且它工作得很好.现在我有一个客户端想要使用我的程序集来编写WCF数据服务,所以我必须编写一个派生自DbContext(使用EF)的类,可以在指定的服务中使用.我的问题是:

  • DbContext自动公开DbSet其中定义的所有属性,因此每个具有最低访问级别的用户都可以看到表的整个数据(当然客户端应用程序将限制数据,但客户端可以直接访问数据,甚至可以将这些数据导入到Excel或Access中的OData)

  • 我有多个类型的公共属性,IQueryable但它们不会出现在WCF数据服务公开的数据列表中.

为了解决这个问题,我认为最完整的解决方案是能够将TVF称为表并从中创建一个集合.但我不知道该怎么做?!

注意 对数据库的任何更改都需要一些日志记录,因此我有存储过程来执行这些更改,因此我只需要对我的WCF数据服务的只读访问权限,并且我不希望默认设置包含在表中发布的表的所有记录.服务

c# entity-framework wcf-data-services entity-framework-5

5
推荐指数
1
解决办法
1148
查看次数

使用Entity Framework 5在SQL Server中连接字符串和数字的最佳方法?

出于某种原因,微软决定不支持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()请回答.

c# entity-framework expression-trees entity-framework-5

5
推荐指数
1
解决办法
1016
查看次数

无法将属性设置为字节值,必须将该属性设置为int32类型的非null

数据库在SQL Server 2005中,我所讨论的列的数据类型定义为tinyint(我无法更改此类型)

我创建了一个类型为的模型Int32.在read语句系统中抛出此错误.

无法将属性设置为字节值,必须将该属性设置为int32类型的非null

我遇到了其他类型的类似问题,然后在检查CLR映射后我更正了它们.现在我只在tinyint和的情况下面对这个问题smallint.

c# sql-server-2005 entity-framework-5

5
推荐指数
1
解决办法
1万
查看次数

修改DAL,System.ArgumentException时出错,"已存在具有相同密钥的条目"

好吧,我完全被这个困扰了.我可能没有足够的信息在这里发布,但我甚至不知道从哪里开始寻找.我正在尝试在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)

c# sql-server-2008 asp.net-mvc-4 entity-framework-5

5
推荐指数
4
解决办法
3542
查看次数