标签: ef-code-first

如何在EF代码优先禁用链接表的级联删除?

我想禁用具有实体框架代码优先的链接表的级联删除.例如,如果许多用户拥有多个角色,并且我尝试删除角色,我希望阻止删除,除非当前没有与该角色关联的用户.我已经删除了我的级联删除约定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生成此删除级联?

.net c# database entity-framework ef-code-first

64
推荐指数
3
解决办法
4万
查看次数

实体框架代码First Fluent Api:向列添加索引

我正在运行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

63
推荐指数
7
解决办法
6万
查看次数

在生产中使用Entity Framework(代码优先)迁移

我只是考虑将EF迁移用于我们的项目,特别是在发布之间的生产中执行模式更改.

我已经看到提到有一个API可以在运行时使用DbMigration该类执行这些迁移,但我找不到任何具体的示例.

理想情况下,我希望DbMigration每个数据库更改一个文件,并在应用程序启动时自动应用这些更改从当前版本到最新版本.

.net entity-framework ef-code-first ef-migrations

63
推荐指数
3
解决办法
4万
查看次数

首先使用EF代码的唯一键

我的项目中有以下模型

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独特的密钥,我搜索解决方案,但找不到任何.可以建议我怎么做,拜托?

c# unique-key ef-code-first entity-framework-4.1

62
推荐指数
2
解决办法
7万
查看次数

我如何热切地将实体的子孙元素包含在实体框架代码优先中?

想象一下这样的三个实体(客户,书籍,作者):

客户有很多书

一本书有一位作者

我使用该数据打印这样的报告:

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)

当我查询客户时,我按预期得到了一堆具有以下性质的查询

  1. 获取客户的查询
  2. 每个客户查询以获取他的书籍
  3. 每本书的查询以获取其作者

我可以通过包含这样的书来减少查询次数:

var customers = db.Customers.Include(c => c.Books);

但我不知道如何加载第三级(作者).我怎样才能做到这一点?

entity-framework eager-loading ef-code-first

61
推荐指数
3
解决办法
3万
查看次数

模拟或伪造DbEntityEntry或创建新的DbEntityEntry

紧接着我关于嘲笑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有什么成功?

或者有更好的方法来处理状态变化吗?

entity-framework ef-code-first

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

多对多映射表

从我在网上和编程实体框架CodeFirst一书中看到的例子中,当你在两个类上都有一个集合时,EF将创建一个映射表,例如MembersRecipes,每个类的主键将链接到该表.

但是,当我执行下面的操作时,我会在Recipes表中调用一个新字段,Member_IdRecipe_IdMembers表中创建一个字段.

这只会创建两个一对多关系,但不会产生多对多关系,所以我可以将成员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)

c# many-to-many entity-framework ef-code-first

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

EF codefirst:我应该初始化导航属性吗?

我曾经看过一些书(例如编程实体框架代码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

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

实体框架,更新相关对象的问题

我目前正在使用最新版本的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)

c# entity-framework ef-code-first

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

如何在使用Entity Framework 6.1和MVC 5从数据库中使用Code First后同步模型?

假设

  • 使用EF 6.1,MVC 5,VS 2013,C#

  • 我有一个在Toad DM for SQL Server中设计的现有数据库模型,并且保持它始终更新非常重要

步骤和笔记

  1. 使用ADO.NET实体数据模型我从数据库中选择Code First(EF 6.1中的新功能)来生成模型.注意:模型类和DbContext类成功生成但生成了NO .edmx或.tt文件.

  2. 接下来,我使用Entity Framework添加了一个新的脚手架项:带有视图的MVC 5控制器.注意:生成成功,控制器和视图

从现在开始,我不想使用Code First来更新我的数据库.相反,我希望根据数据库更改来更新模型.接下来做什么?如果我没有edmx文件,我将无法从数据库更新我的模型类?

c# ef-code-first ef-database-first entity-framework-6 asp.net-mvc-5

57
推荐指数
3
解决办法
4万
查看次数