我想禁用具有实体框架代码优先的链接表的级联删除.例如,如果许多用户拥有多个角色,并且我尝试删除角色,我希望阻止删除,除非当前没有与该角色关联的用户.我已经删除了我的级联删除约定OnModelCreating:
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
...
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
Run Code Online (Sandbox Code Playgroud)
然后我设置了用户角色链接表:
modelBuilder.Entity<User>()
.HasMany(usr => usr.Roles)
.WithMany(role => role.Users)
.Map(m => {
m.ToTable("UsersRoles");
m.MapLeftKey("UserId");
m.MapRightKey("RoleId");
});
Run Code Online (Sandbox Code Playgroud)
然而,当EF创建数据库时,它会为外键关系创建一个删除级联,例如.
ALTER TABLE [dbo].[UsersRoles] WITH CHECK ADD CONSTRAINT [FK_dbo.UsersRoles_dbo.User_UserId] FOREIGN KEY([UserId])
REFERENCES [dbo].[User] ([UserId])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[UsersRoles] WITH CHECK ADD CONSTRAINT [FK_dbo.UsersRoles_dbo.Role_RoleId] FOREIGN KEY([RoleId])
REFERENCES [dbo].[Role] ([RoleId])
ON DELETE CASCADE
GO
Run Code Online (Sandbox Code Playgroud)
如何阻止EF生成此删除级联?
我正在运行EF 4.2 CF并想在我的POCO对象的某些列上创建索引.
举个例子,假设我们有这个员工类:
public class Employee
{
public int EmployeeID { get; set; }
public string EmployeeCode { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime HireDate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我们经常通过EmployeeCode对员工进行搜索,因为有很多员工,因为性能原因而将索引编入索引会很不错.
我们能用流利的api以某种方式做到这一点吗?或者数据注释?
我知道可以执行这样的sql命令:
context.Database.ExecuteSqlCommand("CREATE INDEX IX_NAME ON ...");
Run Code Online (Sandbox Code Playgroud)
我非常想避免那样的原始SQL.
我知道这不存在,但寻找沿着这些方向的东西:
class EmployeeConfiguration : EntityTypeConfiguration<Employee>
{
internal EmployeeConfiguration()
{
this.HasIndex(e => e.EmployeeCode)
.HasIndex(e => e.FirstName)
.HasIndex(e => e.LastName);
}
}
Run Code Online (Sandbox Code Playgroud)
或者使用System.ComponentModel.DataAnnotationsPOCO可能看起来像这样(我知道这不存在):
public class Employee
{ …Run Code Online (Sandbox Code Playgroud) c# fluent-interface entity-framework-4 data-annotations ef-code-first
我只是考虑将EF迁移用于我们的项目,特别是在发布之间的生产中执行模式更改.
我已经看到提到有一个API可以在运行时使用DbMigration该类执行这些迁移,但我找不到任何具体的示例.
理想情况下,我希望DbMigration每个数据库更改一个文件,并在应用程序启动时自动应用这些更改从当前版本到最新版本.
我的项目中有以下模型
public class Category
{
public Guid ID { get; set; }
[Required(ErrorMessage = "Title cannot be empty")]
public string Title { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
而我正在尝试制作一个Title独特的密钥,我搜索解决方案,但找不到任何.可以建议我怎么做,拜托?
想象一下这样的三个实体(客户,书籍,作者):
客户有很多书
一本书有一位作者
我使用该数据打印这样的报告:
Customer: Peter
Book: To Kill a Mockingbird - Author: Harper Lee
Book: A Tale of Two Cities - Author: Charles Dickens
Customer: Melanie
Book: The Hobbit - Author: J. R. R. Tolkien
Run Code Online (Sandbox Code Playgroud)
当我查询客户时,我按预期得到了一堆具有以下性质的查询
我可以通过包含这样的书来减少查询次数:
var customers = db.Customers.Include(c => c.Books);
但我不知道如何加载第三级(作者).我怎样才能做到这一点?
紧接着我关于嘲笑DbContext的另一个问题.我还有另外一个关于模拟 EF Code First的问题.
我现在有一个更新的方法,如下所示:
if (entity == null)
throw new ArgumentNullException("entity");
Context.GetIDbSet<T>().Attach(entity);
Context.Entry(entity).State = EntityState.Modified;
Context.CommitChanges();
return entity;
Run Code Online (Sandbox Code Playgroud)
Context是我自己的DbContext的接口.
我遇到的问题是,我该如何处理
Context.Entry(entity).State.
我已经介绍了这段代码,当我有一个真实的DbContext作为我的Context接口的实现时,它就可以工作了.但是当我把假的上下文放在那里时,我不知道如何处理它.
DbEntityEntry类没有构造函数,所以我不能在我的伪上下文中创建一个新构造函数.
有没有人在CodeFirst解决方案中嘲弄或伪造DbEntityEntry有什么成功?
或者有更好的方法来处理状态变化吗?
从我在网上和编程实体框架CodeFirst一书中看到的例子中,当你在两个类上都有一个集合时,EF将创建一个映射表,例如MembersRecipes,每个类的主键将链接到该表.
但是,当我执行下面的操作时,我会在Recipes表中调用一个新字段,Member_Id并Recipe_Id在Members表中创建一个字段.
这只会创建两个一对多关系,但不会产生多对多关系,所以我可以将成员3链接到食谱(4,5,6)和配方4链接到成员(1,2,3)等.
有没有办法创建这个映射表?如果是这样,你如何命名其他东西,如"烹饪书"?
谢谢
public abstract class Entity {
[Required]
public int Id { get; set; }
}
public class Member : Entity {
[Required]
public string Name { get; set; }
public virtual IList<Recipe> Recipes { get; set; }
}
public class Recipe : Entity {
[Required]
public string Name { get; set; }
[ForeignKey("Author")]
public int AuthorId { get; set; }
public virtual Member Author { get; …Run Code Online (Sandbox Code Playgroud) 我曾经看过一些书(例如编程实体框架代码Julia Lerman)定义了他们的域类(POCO)而没有初始化导航属性,如:
public class User
{
public int Id { get; set; }
public string UserName { get; set; }
public virtual ICollection<Address> Address { get; set; }
public virtual License License { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
生成POCO时,其他一些书籍或工具(例如Entity Framework Power Tools)初始化类的导航属性,如:
public class User
{
public User()
{
this.Addresses = new IList<Address>();
this.License = new License();
}
public int Id { get; set; }
public string UserName { get; set; }
public virtual ICollection<Address> Addresses { …Run Code Online (Sandbox Code Playgroud) c# domain-driven-design entity-framework navigation-properties ef-code-first
我目前正在使用最新版本的Entity Framework进行项目,我遇到了一个我似乎无法解决的问题.
在更新现有对象时,我可以相当容易地更新对象属性,直到它涉及到另一个类的引用的属性.
在下面的例子中,我有一个名为Foo的类,它存储各种属性,其中2个是其他类的实例
public class Foo
{
public int Id {get; set;}
public string Name {get; set;}
public SubFoo SubFoo {get; set}
public AnotherSubFoo AnotherSubFoo {get; set}
}
Run Code Online (Sandbox Code Playgroud)
当我使用下面的Edit()方法时,我传入了我想要更新的对象,我可以设法Name正确更新,但是我没有设法找到一种方法来更改SubFoo的属性.例如,如果SubFoo类具有属性Name,并且已更改并且在我的数据库与之间不同newFoo,则不会更新.
public Foo Edit(Foo newFoo)
{
var dbFoo = context.Foo
.Include(x => x.SubFoo)
.Include(x => x.AnotherSubFoo)
.Single(c => c.Id == newFoo.Id);
var entry = context.Entry<Foo>(dbFoo);
entry.OriginalValues.SetValues(dbFoo);
entry.CurrentValues.SetValues(newFoo);
context.SaveChanges();
return newFoo;
}
Run Code Online (Sandbox Code Playgroud)
任何帮助或指针将不胜感激.
更新:根据Slauma的评论我修改了我的方法
public Foo Edit(Foo newFoo)
{
var dbFoo = …Run Code Online (Sandbox Code Playgroud) 使用EF 6.1,MVC 5,VS 2013,C#
我有一个在Toad DM for SQL Server中设计的现有数据库模型,并且保持它始终更新非常重要
使用ADO.NET实体数据模型我从数据库中选择Code First(EF 6.1中的新功能)来生成模型.注意:模型类和DbContext类成功生成但生成了NO .edmx或.tt文件.
接下来,我使用Entity Framework添加了一个新的脚手架项:带有视图的MVC 5控制器.注意:生成成功,控制器和视图
从现在开始,我不想使用Code First来更新我的数据库.相反,我希望根据数据库更改来更新模型.接下来做什么?如果我没有edmx文件,我将无法从数据库更新我的模型类?
c# ef-code-first ef-database-first entity-framework-6 asp.net-mvc-5