今天我发现实体框架正在向它生成的 SQL 添加一个不必要的子查询。我开始挖掘我的代码,试图缩小它的来源。A(很长)一段时间后,我指出了导致它的原因。但是现在我比开始时更困惑,因为我不知道为什么会这样。
基本上我发现的是,在某些情况下,简单地将常量转换为变量可以改变实体框架生成的 SQL。我已将所有内容缩小到最低限度,并将其打包在一个小型控制台应用程序中:
using System;
using System.Data.Entity;
using System.Linq;
class Program
{
private static readonly BlogContext _db = new BlogContext();
static void Main(string[] args)
{
const string email = "foo@bar.com";
var comments = from c in _db.Comments
where c.Email == email
select c;
var result = (from p in _db.Posts
join c in comments on p.PostId equals c.PostId
orderby p.Title
select new { p.Title, c.Content });
Console.WriteLine(result);
}
}
public class BlogContext : DbContext
{
public DbSet<Post> Posts …Run Code Online (Sandbox Code Playgroud) c# linq-to-entities entity-framework code-first entity-framework-4
我知道 Code-First 使用模型绑定约定,并且这是默认可用(并且处于活动状态?)的约定列表。
看来多对多关系的联结表名称的选择有点随机。
使用哪个引用约定来确定连接表名称?用于确定该名称的算法是什么?
我有 DateTime 的并发令牌问题。这是重现问题的简单方法。拥有一个实体:
public class Employee
{
public int EmployeeID { get; set; }
public string Name { get; set; }
[ConcurrencyCheck]
public DateTime LastModified { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
一个简单的 DbContext:
public class MyContext : DbContext
{
public DbSet<Employee> Employees { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
以及以下代码:
Employee orig;
// Create a row (insert)
using (var context = new MyContext())
{
orig = new Employee
{
Name = "Mike",
LastModified = DateTime.Now
};
context.Employees.Add(orig);
context.SaveChanges();
}
// Update the row, …Run Code Online (Sandbox Code Playgroud) 这些是我的课程:
public class Post : IPost
{
public int Id { get; set; }
public virtual int[] DuplicateOf { get; set; }
public virtual ICommentInfo[] Comments { get; set; }
}
public class CommentInfo : ICommentInfo
{
public virtual string Author { get; set; }
public virtual int Id { get; set; }
public virtual string Text { get; set; }
public virtual int PostId{ get; set; }
[ForeignKey("PostId")]
public virtual Post Post { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
将此 CommentConfiguration …
foreign-key-relationship code-first navigation-properties ef-code-first entity-framework-5
这是我正在做的事情、正在发生的事情以及应该发生的事情的通用示例:
首先,我声明我的代码优先模型,如下所示:
语境:
namespace Models {
public class MyContext : DbContext
{
public DbSet<ClassA> ClassA { get; set; }
public DbSet<ClassB> ClassB { get; set; }
public MyContext()
: base("name=MyContext")
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
A 类和 B 类:
namespace Models {
public class ClassA
{
public int ClassAID { get; set; }
public string BaseAVal { get; set; }
public virtual ICollection<ClassB> ClassBChildren {get; set; }//Relation Property
}
public class ClassB
{
public int ClassBID { get; set; }
public …Run Code Online (Sandbox Code Playgroud) 我有以下几点:
string sproc = AppDomain.CurrentDomain.BaseDirectory + "/Stored Procedures/new_message.sql";
context.Database.ExecuteSqlCommand(sproc);
Run Code Online (Sandbox Code Playgroud)
但是,sproc由于某种原因,该路径无效。从SeedEF 代码优先迁移方法访问项目目录中的文件的正确方法是什么?
我想通过 hibernate 和 java 的代码优先方法生成我的数据库。我成功生成了数据库,但我错过了我的迁移文件。hibernate 支持迁移,例如 .NEt 中的 EntityFrameworkCore、PHP 中的 Eloquent 或节点中的 Sequelize?
这是我生成数据库的类:
public class CreateDataBase {
public static void main(String[] args) {
Configuration conf = new Configuration();
conf.configure();
SchemaExport se = new SchemaExport(conf);
se.create(true, true);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的架构:
package Infra.HibernateConfiguration;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Bank {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column()
private String code;
@Column()
private String name;
public int getId() {
return id;
}
public …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用实体框架工作核心并打开一个新的 asp.net 核心项目。当我尝试通过 nuget 包管理器安装 Microsoft.EntityFrameworkCore.SqlServer 时,出现以下错误。
包 Microsoft.EntityFrameworkCore.SqlServer 3.0.0 与 net461 (.NETFramework,Version=v4.6.1) 不兼容。包 Microsoft.EntityFrameworkCore.SqlServer 3.0.0 支持:netstandard2.1 (.NETStandard,Version=v2.1)
当我点击它时,我被发送到 .csproj 文件。
在该文件中,我将目标框架从
<TargetFramework>net461</TargetFramework>更改
<TargetFramework>netstandard2.1 </TargetFramework>为错误所暗示的。
这样做可以消除错误,但是当我在包管理器控制台中使用命令“add-migration”时,出现此错误。
“术语 'add-migration' 不被识别为 cmdlet 的名称”
我不确定接下来要做什么。请帮忙。我希望我已经清楚地解释了这个问题。
删除 project.assets 文件或更新 nuget 包管理器并使用命令“enable-migrations”也没有奏效。
DBContext类是
public class VGDB : DbContext
{
public DbSet<Planet> Planets { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
模型看起来像:
public class Planet
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
...
public List<Building> Constructions { get; set; }
}
public class Building
{
[Key]
public int Id { get; set; }
public decimal Lvl { get; set; }
public string Type { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
存储库类:
public class VGDBRepository
{
private readonly VGDB _vgdb; …Run Code Online (Sandbox Code Playgroud) 我在更新DB中的现有实体时遇到问题.我正在使用Entity Framework Code First.
我有计算食物的小程序.
我的域类>
public class Unit
{
public int Id { get; set; }
public string Name { get; set; }
}
public abstract class Item
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Ingredient : Item
{
public virtual Unit Unit { get; set; }
public decimal Price { get; set; }
}
public class Recipe : Item
{
public virtual List<RecipeItem> Items { get; set; …Run Code Online (Sandbox Code Playgroud)