标签: ef-fluent-api

EF Code First Fluent API定义唯一约束

我试图首先使用fluent配置代码来强制执行列的唯一约束.有没有比在业务逻辑中实现它或使用类似下面的东西更好的方法

context.ObjectContext.ExecuteStoreCommand("CREATE UNIQUE CONSTRAINT...");
Run Code Online (Sandbox Code Playgroud)

或者我想知道是否不可能使用流畅的配置实现独特的约束?

编辑:

已经证实,使用流畅的配置是不可能的.但是我又想知道最好的方法是什么?并且想知道EF不支持这一点的原因.

c# entity-framework entity-framework-5 ef-fluent-api

5
推荐指数
1
解决办法
5972
查看次数

EF Fluent API多对多具有不同的ID字段名称

在这个问题:Ef Many To Many,一个关于如何手动指定链接表的答案.但我有一个稍微独特的情况(我肯定不是真的很独特).

我的两个表都有一个Id字段.EG:[dbo].[Account].[Id][dbo].[Person].[Id].我的Code-First中的每个表都有以下OnModelCreating:

modelBuilder.Entity<Account>.HasKey(x => x.Id);
modelBuilder.Entity<Person>.HasKey(x => x.Id);
Run Code Online (Sandbox Code Playgroud)

但我的[dbo].[AccountsToPersons]...桌子有EG:[AccountId][PersonId]

AccountsToPersons表不由代码中的类表示.

我显然已经有了一个现有的模型,但是我们使用EF Code-First Fluent API而不是从数据库更新模型.

那么如何更改此代码以使其与映射不同的ID列名称一起使用?

public DbSet<Person> Persons { get; set; }
public DbSet<Account> Accounts { get; set; }
. . .
modelBuilder.Entity<Account>()
  .HasMany(a => a.Persons)
  .WithMany()
  .Map(x =>
  {
    x.MapLeftKey("AccountId"); // <-- Account.Id to AccountsToPersons.AccountId??
    x.MapRightKey("PersonId"); // <-- Person.Id  to AccountsToPersons.PersonId??
    x.ToTable("AccountsToPersons");
  });
Run Code Online (Sandbox Code Playgroud)

运行基本的Linq To EF Query时(from x in context.Accounts select x).ToList();,查询失败并显示以下错误:

  • "无效的列名'Person_Id'." …

c# entity-framework ef-fluent-api

5
推荐指数
1
解决办法
2823
查看次数

实体框架7 Fluent API无法识别IsOptional()

我正在使用实体框架7在我的Asp.Net 5项目中设置我的数据库,以前使用EF 6,当我想让我的一些列可以为空时,我会使用:

modelBuilder.Entity<Article>().Property(t => t.ArticleDateModified).IsOptional();
Run Code Online (Sandbox Code Playgroud)

但似乎IsOptional不再是EF7的一部分,我想知道如何使用EF7实现同样的目标?

编辑: 马克的答案确实是正确的,首先我虽然它有效,因为我找到了类似的东西IsOptional:

builder.Entity<Article>().Property(t => t.ArticleDateModified).IsRequired(false);
Run Code Online (Sandbox Code Playgroud)

但是在没有它的情况下运行一些测试后,它将数据库列设置为可空,因为我在域模型中将其标记为可为空:

public DateTime? ArticleDateModified { get; set; }
Run Code Online (Sandbox Code Playgroud)

另外值得注意的是,当我使用DateTime非可空并使用时IsRequired(false),我收到以下错误:

实体类型"Article"上的属性"ArticleDateModified"不能标记为nullable/optional,因为属性的类型是"DateTime",它不是可空类型.任何属性都可以标记为不可为空/必需,但只有可空类型的属性和不属于主键的属性可以标记为可空/可选.

所以,我想知道在IsRequired(false)这里有什么用,如果我要做的一件事就是让数据库列可以为空,那么在我的域类中它是否可以为空?

entity-framework entity-framework-core ef-fluent-api

5
推荐指数
2
解决办法
3288
查看次数

流利的Api实体框架核心

用户可以拥有1个或0个帐户

public class User
    {
        public int UserId { get; set; }
        public string Name { get; set; }
        public string Email { get; set; }
        public Account Account { get; set; }
    }

    public class Account
    {
        public int AccountId { get; set; }         
        public DateTime CreatedDateTime { get; set; }
        public User User { get; set; }

    }
Run Code Online (Sandbox Code Playgroud)

这是使用Entity Framework 6的流利的api代码

public class ClassDbContext: DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        modelBuilder.Entity<User>()
                  .HasOptional(s => s.Account) 
                  .WithRequired(ad => …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework entity-framework-core ef-fluent-api

5
推荐指数
1
解决办法
4069
查看次数

实体框架中可选的一对多关系

我在解决可选的一对多关系问题时遇到了问题.

我的模型是:

public class Person
{
    public int Identifier { get; set; }
    ...
    public virtual Department Department { get; set; }
}

public class Department
{
    public int Identifier { get; set; }
    ...
    public virtual IList<Person> Members { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想分配零或一个DepartmentPerson.分配时,Person应显示在Members-List中Department.

我正在配置Person使用Fluent API,如下所示:

HasKey(p => p.Identifier);
HasOptional(p => p.Department).WithMany(d => d.Members);
Run Code Online (Sandbox Code Playgroud)

另外通过配置Department而不是Person:

HasMany(d => d.Members).WithOptional(p => p.Department);
Run Code Online (Sandbox Code Playgroud)

但是我用这两种方法得到了例外:

无法确定类型'Person'和'Department'之间关联的主要结束.必须使用关系流畅API或数据注释显式配置此关联的主要结尾.

当同时配置这两个时,我得到: …

c# entity-framework entity-framework-6 ef-fluent-api

4
推荐指数
1
解决办法
7430
查看次数

我是否需要使用Fluent API配置与Entity Framework的关系的双方?

我是Fluent API的新手。在我的情况下,一个Student可以合而为一Grade,一个Grade可以有多个Students。然后,这两个语句完成相同的操作:

modelBuilder
.Entity<Student>()
.HasRequired<Grade>(s => s.Grade)
.WithMany(s => s.Students);
Run Code Online (Sandbox Code Playgroud)

和:

modelBuilder
.Entity<Grade>()
.HasMany<Student>(s => s.Students)
.WithRequired(s => s.Grade);
Run Code Online (Sandbox Code Playgroud)

我的问题是-我应该如何选择一个陈述而不是另一个?还是我需要两个陈述?

entity-framework ef-fluent-api

4
推荐指数
1
解决办法
728
查看次数

删除EF Core 1.0 RC2中的自动增量(以前的EF 7 RC2)

在Entity Framework Core 1.0 RC2(以前的Entity Framework 7 RC2)中,默认情况下,所有整数主键都是自动增量字段.我尝试了一切来删除它.从使用数据注释到流畅的API,没有任何作用.

使用数据注释:

[Key, Column(Order = 1, TypeName = "INT"), DatabaseGenerated(DatabaseGeneratedOption.None)]
Run Code Online (Sandbox Code Playgroud)

使用流畅的API:

modelBuilder.Entity<tblProduct>().HasKey(t => t.ProdId).HasAnnotation("DatabaseGenerated", DatabaseGeneratedOption.None);

//OR use the following
modelBuilder.Entity<tblProduct>().HasKey(t => t.ProdId).HasAnnotation("DatabaseGenerated", 0);

//OR use the following
modelBuilder.Entity<tblProduct>().HasKey(t => t.ProdId).HasAnnotation("Sqlite:Autoincrement", false);
Run Code Online (Sandbox Code Playgroud)

没有任何工作:(

你能帮我么?

更新

正如请求的那样,这是运行add-migration LocalDB_v1后得到的表脚本

migrationBuilder.CreateTable(
            name: "tblProduct",
            columns: table => new
            {
                ProdId = table.Column<int>(nullable: false)
                    .Annotation("Sqlite:Autoincrement", true),
                Name = table.Column<string>(nullable: true),
                Description = table.Column<string>(nullable: true)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_tblProduct", x => x.ProdId);
            });
... …
Run Code Online (Sandbox Code Playgroud)

c# sqlite entity-framework-core ef-fluent-api

4
推荐指数
1
解决办法
3084
查看次数

实体框架一对多,只有一个导航属性:WithRequiredDependant?

使用最新的实体框架,我有一个一对多的类,在多方面只有一个导航属性。

MSDN 中所述:Entity Framework Fluent API - Relationships

单向(也称为单向)关系是指仅在关系的一个端点上而不是在两个端点上定义导航属性。

简化:aSchool有很多Students;School 和 Student 之间存在一对多关系,但 School 没有包含学生集合的属性

class Student
{
    public int Id {get; set;}
    // a Student attends one School; foreign key SchoolId
    public int SchoolId {get; set;}
    public School School {get; set;}
}

class School
{
    public int Id {get; set;}
    // missing: public virtual ICollection<Studen> Students {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

在双向关系中,您可以在 中编写以下流畅的 API OnModelCreating

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Student>()
        .HasRequired(student => …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework ef-fluent-api

4
推荐指数
1
解决办法
2191
查看次数

ef 核心忽略导航属性

我有一个实体User,它有两个属性CreatedBy并且UpdatedBy都引用User. 默认情况下,EF 假定这两者是一对一的关系。我收到以下错误消息:

消息:System.InvalidOperationException:无法确定在“User.CreatedBy”和“User.UpdatedBy”之间检测到的一对一关系的子/从属端。要识别关系的子/依赖方,请配置外键属性。如果这些导航不应该是同一关系的一部分,请在不指定反向的情况下配置它们。有关更多详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=724062

目前,我有一个这样的课程:

public class User
{

    public int Id { get; set; }

    public int? CreatedById { get; set; }
    public User CreatedBy { get; set; }

    public int? UpdatedById { get; set; }
    public User UpdatedBy { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

基本上,这就是我正在尝试的:

  • created 和 updated 彼此没有关系(不需要导航/反向属性)
  • 任意数量的用户都可以拥有相同的CreatedBy,任意数量的用户都可以拥有相同的UpdatedBy

我怎样才能让 EF 忽略导航属性?我拥有的主要原因CreatedBy是我Include(u => u.CreatedBy)以后可以使用。我知道使用IEnumerable<User> AllCreatedUsers属性可以解决这个问题,但我不想为IEnumerable我的实体中的每个创建一个。有没有办法用流畅的 API …

c# navigation-properties entity-framework-core ef-fluent-api ef-core-2.0

4
推荐指数
1
解决办法
6186
查看次数

为 id EF Core 3.1 创建重复的外键和列

ef core 3.1 为另一个表中的 id 字段创建重复列时遇到问题。我目前有一个继承自 IdentityUser 的 ApplicationUser 实体,以及一个将 ApplicationUser id 存储为 UserId 的属性实体。

 public class Property
    {
        public Guid PropertyId { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public Guid AddressId { get; set; }
        public Address PropertyAddress { get; set; }
        public bool IsHome { get; set; }
        public string UserId { get; set; }
        public ApplicationUser User { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)
public class ApplicationUser : …
Run Code Online (Sandbox Code Playgroud)

c# ef-fluent-api ef-core-3.1

4
推荐指数
1
解决办法
3620
查看次数