标签: entity-framework-6.1

实体框架6.1更新记录的子集

我有一个视图模型,只封装了一些数据库模型属性.视图模型包含的这些属性是我想要更新的唯一属性.我希望其他属性保留其价值.

在我的研究过程中,我发现这个 答案看起来很适合我的需求,但是,尽管我付出了最大的努力,但我无法让代码按预期工作.

这是我想出的一个孤立的例子:

static void Main() {
    // Person with ID 1 already exists in database.

    // 1. Update the Age and Name.
    Person person = new Person();
    person.Id = 1;
    person.Age = 18;
    person.Name = "Alex";

    // 2. Do not update the NI. I want to preserve that value.
    // person.NINumber = "123456";

    Update(person);
}

static void Update(Person updatedPerson) {
    var context = new PersonContext();

    context.Persons.Attach(updatedPerson);
    var entry = context.Entry(updatedPerson);

    entry.Property(e => e.Name).IsModified = true; …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework entity-framework-6.1

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

使用DbMigrationsConfiguration将SetExecutionStrategy设置为SqlAzureExecutionStrategy?

我今天看到一篇关于实现SqlAzureExecutionStrategy的帖子:

http://romiller.com/tag/sqlazureexecutionstrategy/

但是,我能找到的所有示例都使用从DbConfiguration继承的Configuration.我的项目使用的是EF6 Code First Migrations,它创建的Configuration继承自DbMigrationsConfiguration.此类不包含SetExecutionStrategy的定义,我找不到实际将SqlAzureExecutionStrategy(或任何SetExecutionStrategy)与DbMigrationsConfiguration结合使用的示例.

可以这样做吗?

entity-framework ef-migrations entity-framework-6.1 azure-sql-database

15
推荐指数
1
解决办法
7579
查看次数

仅在数据库中存储日期而不是时间部分C#

我有一个测试类和一个ExecutionDate只存储日期的属性,但是当我们使用[DataType(DataType.Date)]它时也将时间部分存储在数据库中,但我只想要日期部分.

public class Test
{
     [Key]
     public int Id { get; set; }

     [DataType(DataType.Date)]
     public DateTime ExecutionDate { get; set; }      
}
Run Code Online (Sandbox Code Playgroud)

有没有办法只使用Entity Framework在db中存储日期时间部分?请帮我....

我在使用时添加了快照[DataType(DataType.Date)],存储时间部分00:00我要删除它

在此输入图像描述

c# datetime entity-framework sqldatatypes entity-framework-6.1

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

在Entity Framework Interceptor中添加内部联接到DbScanExpression

我正在尝试使用Entity Framework CommandTree拦截器通过DbContext为每个查询添加一个过滤器.

为简单起见,我有两个表,一个名为"User",有两列("UserId"和"EmailAddress"),另一个名为"TenantUser",有两列("UserId"和"TenantId").

每次有User表的DbScan时,我想对TenantUser表进行内连接并根据TenantId列进行过滤.

有一个名为EntityFramework.Filters的项目沿着这些方向做了一些事情,但不支持"复杂连接",这似乎是我正在尝试做的事情.

TechEd 2014的演示之后,我创建了一个拦截器,它使用带有下面方法的访问者用DbJoinExpression替换DbScanExpressions.一旦我开始工作,我计划将其包装在DbFilterExpression中,以将TenantId列与已知ID进行比较.

    public override DbExpression Visit(DbScanExpression expression)
    {
        var table = expression.Target.ElementType as EntityType;
        if (table != null && table.Name == "User")
        {
            return DbExpressionBuilder.InnerJoin(expression, DbExpressionBuilder.Scan(expression.Target), (l, r) =>
                DbExpressionBuilder.Equal(DbExpressionBuilder.Variable(tenantUserIdProperty.TypeUsage, "UserId"),
                    DbExpressionBuilder.Variable(userIdProperty.TypeUsage, "UserId")));
        }

        return base.Visit(expression);
    }
Run Code Online (Sandbox Code Playgroud)

为了测试上面的代码,我已经将拦截器添加到dbContext并运行以下代码:

    dbContext.Users.Select(u => new { u.EmailAddress }).ToList();
Run Code Online (Sandbox Code Playgroud)

但是,这会导致以下错误:

没有名称为'EmailAddress'的属性由类型'Transient.rowtype [(l,CodeFirstDatabaseSchema.User(Nullable = True,DefaultValue =)),(r,CodeFirstDatabaseSchema.User(Nullable = True,DefaultValue =))]声明".

我是否错误地构建了DbJoinExpression?还是我错过了别的什么?

c# entity-framework entity-framework-6 entity-framework-6.1

14
推荐指数
1
解决办法
1428
查看次数

实体框架代码首先迁移保留现有数据

我正在使用EF 6.1,我使用代码优先方法与现有数据库一起使用生产环境中的数据.

是否可以迁移模型更改并保留现有客户的数据?

entity-framework entity-framework-6.1

12
推荐指数
1
解决办法
5930
查看次数

如何在Entity Framework中完全锁定一行

我正在处理我们处理货币交易的情况.

例如,我有一个用户钱包表,其中包含余额.

UserId; Wallet Id; Balance
Run Code Online (Sandbox Code Playgroud)

现在在我们的网站和Web服务中,每当某个事务发生时,我们需要:

  1. 检查是否有足够的资金可用于执行该交易:
  2. 从余额中扣除交易成本.

如何以及在整个交易期间锁定该行/实体的正确方法是什么?

根据我的阅读,有一些解决方案,其中EF标记一个实体,然后在将其保存回数据库时对该标记进行比较,但是当另一个用户/程序已经编辑了该数量时它又做了什么?

我能用EF实现这个目标吗?如果没有,我有什么其他选择?

调用存储过程可能允许我正确地锁定行,这样当程序A锁定它时,没有其他人可以访问SQL Server中的那一行吗?

c# sql-server entity-framework rowlocking entity-framework-6.1

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

在实体框架中使用.include创建巨大的查询?

我没想到像这样生成的查询......

放开,如果我保留一个包含,查询看起来不错,它会做一个简单的左连接

查询:

using (var db = new Context())
{
    var data = db.MainTables.Include(x => x.LookupTables)
                            .Where(d => d.MainId == 10)
                            .FirstOrDefault();
}
Run Code Online (Sandbox Code Playgroud)

SQL生成:

Opened connection at 2014-05-12 17:37:10 -04:00
SELECT 
    [Project1].[MainId] AS [MainId], 
    [Project1].[C1] AS [C1], 
    [Project1].[LookupId] AS [LookupId]
    FROM ( SELECT 
        [Limit1].[MainId] AS [MainId], 
        [Extent2].[LookupId] AS [LookupId], 
        CASE WHEN ([Extent2].[MainId] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1]
        FROM   (SELECT TOP (1) [Extent1].[MainId] AS [MainId]
            FROM [dbo].[MainTable] AS [Extent1]
            WHERE 10 = [Extent1].[MainId] ) AS …
Run Code Online (Sandbox Code Playgroud)

c# t-sql entity-framework entity-framework-6.1

8
推荐指数
1
解决办法
2156
查看次数

如何使用EF 6.1 fluent API创建空间索引

嗯,这个问题很清楚.是否可以使用Entity Framework 6.1流畅的API 创建空间索引

entity-framework spatial spatial-index entity-framework-6.1 ef-fluent-api

8
推荐指数
2
解决办法
1480
查看次数

实体框架6:有没有办法在不保存内存中的每一行的情况下迭代表

我希望能够遍历实体表中的每一行而不保留内存中的每一行.这是一个只读操作,每行可以在处理后丢弃.

如果有一种方法可以在处理后丢弃该行,那就没问题了.我知道这可以使用DataReader(超出EF的范围)来实现,但它可以在EF中实现吗?

或者有没有办法从EF中获取DataReader而不直接使用SQL?

更详细的例子:

使用EF我可以编码:

foreach (Quote in context.Quotes)
   sw.WriteLine(sw.QuoteId.ToString()+","+sw.Quotation);
Run Code Online (Sandbox Code Playgroud)

但要使用DataReader实现相同的结果,我需要编写代码:

// get the connection to the database
SqlConnection connection = context.Database.Connection as SqlConnection;

// open a new connection to the database
connection.Open();

// get a DataReader for our table
SqlCommand command = new SqlCommand(context.Quotes.ToString(), connection);
SqlDataReader dr = command.ExecuteReader();

// get a recipient for our database fields
object[] L = new object[dr.FieldCount];

while (dr.Read())
{
    dr.GetValues(L);
    sw.WriteLine(((int)L[0]).ToString() + "," + (string)L[1]);
}
Run Code Online (Sandbox Code Playgroud)

区别在于前者耗尽内存(因为它在客户端内存中拉入整个表),后者运行完成(并且速度更快),因为它在任何时候都只在内存中保留一行.

但同样重要的是后一个例子失去了EF的强类型,如果数据库发生变化,就会引入错误.

因此,我的问题是:我们能否在EF中返回强类型行获得类似的结果?

entity-framework entity-framework-6 entity-framework-6.1

8
推荐指数
1
解决办法
8695
查看次数

首先是EF6代码:如何在启动时从EDMX文件加载DbCompiledModel?

我想通过将DbCompiledModel缓存到磁盘来减少EF6中的启动时间.

为DbContext编写EDMX文件很容易:

EdmxWriter.WriteEdmx(myDbContext, XmlWriter.Create(@"C:\temp\blah.xml"))
Run Code Online (Sandbox Code Playgroud)

并且很容易将DbCompiledModel传递给DbContext:

var db = new DbContext(connectionString, myDbCompiledModel)
Run Code Online (Sandbox Code Playgroud)

但是,似乎没有任何方法可以将EDMX文件从磁盘读入DbCompiledModel!我怎样才能做到这一点?

请注意,我已在此分支版本的EF6中使用EdmxReader工具成功实施了该解决方案:

https://github.com/davidroth/entityframework/tree/DbModelStore
Run Code Online (Sandbox Code Playgroud)

但是,我不愿意在生产环境中使用分支版本.我试过从这个分支中提取EdmxReader实用程序,但它依赖于我无法访问的DbCompiledModel的内部构造函数.

那么,我如何从磁盘获取EDMX文件并将其转换为DbCompiledModel?

entity-framework edmx ef-code-first entity-framework-6.1

8
推荐指数
1
解决办法
1786
查看次数