我有一个视图模型,只封装了一些数据库模型属性.视图模型包含的这些属性是我想要更新的唯一属性.我希望其他属性保留其价值.
在我的研究过程中,我发现这个 答案看起来很适合我的需求,但是,尽管我付出了最大的努力,但我无法让代码按预期工作.
这是我想出的一个孤立的例子:
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) 我今天看到一篇关于实现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
我有一个测试类和一个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
我正在尝试使用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?还是我错过了别的什么?
我正在使用EF 6.1,我使用代码优先方法与现有数据库一起使用生产环境中的数据.
是否可以迁移模型更改并保留现有客户的数据?
我正在处理我们处理货币交易的情况.
例如,我有一个用户钱包表,其中包含余额.
UserId; Wallet Id; Balance
Run Code Online (Sandbox Code Playgroud)
现在在我们的网站和Web服务中,每当某个事务发生时,我们需要:
如何以及在整个交易期间锁定该行/实体的正确方法是什么?
根据我的阅读,有一些解决方案,其中EF标记一个实体,然后在将其保存回数据库时对该标记进行比较,但是当另一个用户/程序已经编辑了该数量时它又做了什么?
我能用EF实现这个目标吗?如果没有,我有什么其他选择?
调用存储过程可能允许我正确地锁定行,这样当程序A锁定它时,没有其他人可以访问SQL Server中的那一行吗?
c# sql-server entity-framework rowlocking entity-framework-6.1
我没想到像这样生成的查询......
放开,如果我保留一个包含,查询看起来不错,它会做一个简单的左连接
查询:
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) 嗯,这个问题很清楚.是否可以使用Entity Framework 6.1流畅的API 创建空间索引?
entity-framework spatial spatial-index entity-framework-6.1 ef-fluent-api
我希望能够遍历实体表中的每一行而不保留内存中的每一行.这是一个只读操作,每行可以在处理后丢弃.
如果有一种方法可以在处理后丢弃该行,那就没问题了.我知道这可以使用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中返回强类型行获得类似的结果?
我想通过将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 ×10
c# ×5
datetime ×1
edmx ×1
rowlocking ×1
spatial ×1
sql-server ×1
sqldatatypes ×1
t-sql ×1