我正在开发一个Windows应用程序,我需要在网格中显示对象及其子项列表.因此用户可以修改从实体框架中检索的实体.
在更新db中的对象时,看起来需要从db检索对象并分配新值.这可能会导致性能问题.有没有解决这个问题?
public class Vehicle
{
public Vehicle()
{
this.Fillups = new List<FillupEntry>();
this.Reminders = new List<Reminder>();
}
public int VehicleId { get; set; }
public int UserId { get; set; }
public string Name { get; set; }
public string ModelName { get; set; }
public ICollection<FillupEntry> Fillups { get; set; }
public ICollection<Reminder> Reminders { get; set; }
}
public void Update(Vehicle updatedVehicle)
{
Vehicle vehicleToUpdate =
this.GetDbSet<Vehicle>()
.Where(v => v.VehicleId == updatedVehicle.VehicleId)
.First();
vehicleToUpdate.Name = …Run Code Online (Sandbox Code Playgroud) 我的应用程序中有两个非常简单的接口
表示保存在数据库中的实体
public interface IEntity
{
int Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
只有Nome字段作为保存实体的必填字段的实体
public interface IEntityName : IEntity
{
string Nome { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
许多类实现了这个接口
public class Modalidade : IEntityName
{
public int Id { get; set; }
public string Nome { get; set; }
}
public class Nacionalidade : IEntityName
{
public int Id { get; set; }
public string Nome { get; set; }
}
public class Profissao : IEntityName
{
public …Run Code Online (Sandbox Code Playgroud) 如何检索模型中的列表?
这就是我正在尝试的:
private void cbxPlayers_SelectedValueChanged(object sender, EventArgs e)
{
List<Record> records = new List<Record>();
string selectedPlayer = cbxPlayers.SelectedItem.ToString();
using (ProgressRecordContext context = new ProgressRecordContext())
{
records = (from Player in context.Players
where Player.Name == selectedPlayer
select Player.Records).ToList<Record>();
}
}
Run Code Online (Sandbox Code Playgroud)
然而,这不起作用,我错过了什么?
这些是他们需要的模型:
public class Player
{
[Key][DatabaseGenerated(DatabaseGeneratedOption.None)]
public int AccountNumberId { get; set; }
public string Name { get; set; }
public virtual List<Record> Records { get; set; }
}
public class Record
{
public int RecordId { get; set; } …Run Code Online (Sandbox Code Playgroud) 我有2个班级来保存餐馆的数据.
Status.cs
public class Status
{
[Required]
public int StatusId { get; set; }
[Required]
[DisplayName("Status")]
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
Restaurant.cs
public class Restaurant
{
public int RestaurantId { get; set; }
[Required]
public string Name { get; set; }
[Required]
[EmailAddress]
public string Email { get; set; }
[Required]
public string Telephone { get; set; }
[Required]
public int StatusId { get; set; }
// NAVIGATION PROPERTIES
public virtual Status Status { get; set; } …Run Code Online (Sandbox Code Playgroud) 这是非常自我解释的.我有一个包含另一个的类让我们称它们为主题和课堂
public class Subject
{
public Classroom Class {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用无状态外观,这意味着在恢复对象后立即处理我的DbContext,并创建它以存储新对象.难道不知道Classroom不是新对象,因为它的ID已经在DB中吗?使用调试器我可以在调用SaveChanges方法之前跟踪到该点,而Classroom.id是我在数据库上的那个.有什么问题?EF添加了一个新的Classroom,其具有与前一个相同的属性,但具有新的PK.我在这做错了什么?
这是用于一般CRUD操作的代码(它们在我的DbContext中)更新和删除工作都很好:
public void Update(DbSet MySet, object Obj)
{
MySet.Attach(Obj);
var Entry = this.Entry(Obj);
Entry.State = EntityState.Modified;
this.SaveChanges();
}
public void Insert(DbSet MySet, object Obj)
{
MySet.Add(Obj);
this.SaveChanges();
}
public void Delete(DbSet MySet, object Obj)
{
MySet.Attach(Obj);
var Entry = this.Entry(Obj);
Entry.State = EntityState.Deleted;
this.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud) 我已经在我的实体框架项目上启用了代码优先迁移,并添加了一些迁移,这些迁移执行重命名表等操作.但是,我现在已经删除了数据库并导致实体框架根据我的最新数据模型生成一个全新的数据库.如果我尝试运行:
PM> Add-Migration TestMigration
Run Code Online (Sandbox Code Playgroud)
...它告诉我,我需要先应用现有的迁移.所以我跑:
PM> Update-Database
Run Code Online (Sandbox Code Playgroud)
...但问题是它正在尝试更新不需要更新的数据库; 它已经基于最新的数据模型.因此,当我尝试重命名现在不存在的表时,我收到错误.
我是否可以通过某种方式向数据迁移指出我的数据库是最新的并且不需要在其上运行任何迁移?我该怎么办?
sql-server data-migration entity-framework ef-code-first ef-migrations
我发布了确切的实体:
public class Person : ContactableEntity
{
public Plan Plan { get; set; }
public int Record { get; set; }
public int PersonTypeValue { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我正在使用以下代码以disconected context方式更新:
public void Update(DbSet MySet, object Obj)
{
MySet.Attach(Obj);
var Entry = this.Entry(Obj);
Entry.State = EntityState.Modified;
this.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
这是我的dbContext公开的方法,这种方式调用:
PersistentManager.Update(PersistentManager.Personas,UpdatedPersona);
Run Code Online (Sandbox Code Playgroud)
问题是,EF将更新除引用的Plan对象之外的任何属性.谁能告诉我哪里出错了?事先:实体到达更新点,并正确设置所有属性.EF只是无法更新数据库中的FK(虽然没有例外)更新:尝试解决这样的问题,但它不起作用:
PersistentMgr.Contacts.Attach(Obj);
PersistentMgr.Entry(Obj).State = EntityState.Modified;
PersistentMgr.Entry(Obj.Plan).State = EntityState.Modified;
PersistentMgr.SaveChanges();
Run Code Online (Sandbox Code Playgroud) 我想做一个查询,它将返回我的实体和其他一些相关实体.例如:
select *, (select COUNT(*) from Forms where Contact_Id = Contacts.Id)
as FormsCount from Contacts;
Run Code Online (Sandbox Code Playgroud)
My Contact实体有一个名为FormsCount的属性,但它没有映射,因为表中没有列出类似的列.是否可以编写一个LINQ查询,它将返回我的联系实体,并填写了额外的FormsCount属性?
或者,如果我可以在单独的字段中获取FormsCount值,我会很高兴,我可以手动将它们复制到实体.查询的结果可以是这种形式,例如:
{
Contact Contact;
int FormsCount;
}
Run Code Online (Sandbox Code Playgroud)
然后我可以迭代结果并将FormsCount复制到Contact.也许这可以通过使用预测来实现?
我知道如何使用2个查询来执行此操作:a)首先获取联系人实体b)获取第一个查询中返回的联系人的联系ID或联系人ID和FormsCount.
但我想使用一个查询来做到这一点.另外,我不希望我的Contact实体中始终填充FormsCount属性,我希望能够控制它.有任何想法吗?
谢谢,米哈尔
我正在使用带有Code First的Entity Framework 5。我编写了一个自定义变量IDbConnectionFactory,希望用于类的所有连接DbContext,因此在应用程序生命周期的早期,在完成任何数据库工作之前,我会调用
Database.DefaultConnectionFactory = new MyConnectionFactory();
Run Code Online (Sandbox Code Playgroud)
但是,MyConnectionFactory.CreateConnection从未被调用过,这向我暗示了EF将其改回了-但是调试器显示MyConnectionFactory在运行了几个查询之后它仍然是a 。由于某种原因,它只是没有使用它。
我DbContext是通过从app.config文件中传递连接字符串的名称来初始化的,而这些连接字符串确实指定了显式提供程序(确实必须如此),所以我想知道这是否导致连接的每次连接覆盖基于连接字符串的工厂。是否会发生这种情况,我是否可以在不注册一个全新的提供程序的情况下停止它(尽管也许这样做并不难吗?)。
我在网上看到的所有内容(在各种app.config示例中都被defaultConnectionFactory标记所遮盖)建议您可以将其更改IDbConnectionFactory为您选择的实例,并且可以正常工作,但我的行为却不行。
这样做的目的是允许我在打开新连接时运行一组特定的SQL语句,因此该问题的第二部分将是有人知道更好的方法吗?
我已经反向设计了一个小型数据库,它首先包含许多表和视图到EF 5代码中.
当我这样做时,我为每个表获取了一组模型和映射类,当我尝试使用生成的查询数据库时,这些类很有效DbContext.
它还为我的每个视图生成POCO类,但是当我运行Enable-Migrations并Add-Migration使用Package Manager控制台时,迁移不会重新创建SQL Server视图.
我尝试手动更新迁移以使用自定义SQL创建视图,如下所示:
Sql("CREATE VIEW [dbo].[viewUsersDeactivated] "
+ "AS "
+ "SELECT ... ");
Run Code Online (Sandbox Code Playgroud)
这在运行时工作正常Update-Database,但从Update-Database -Script命令输出的SQL脚本似乎无效,导致以下错误:
'CREATE VIEW'必须是批次中唯一的声明.
Sql("GO");在每个自定义SQL语句之间插入适用于脚本生成,但随后我无法再使用Update-Database,我找不到适合两者的方法.
所以我的问题归结为:如何在代码第一个迁移脚本中包含SQL Server视图,这样我就可以使用Update-Database生成的脚本和使用生成的脚本来创建数据库Update-Database -Script?
谢谢!