标签: ef-fluent-api

TPC继承错误

使用C#Entity Framework Codefirst和Fluent Api,我有一个TPC继承的奇怪问题.我有3类命名Person,Invoice并且PeriodicInvoice你可以看到下面.以下是我的代码摘要:

Invoice class及其配置类:

public class Invoice : InvoiceBase
{
    public Person User { get; set; }
}

public class InvoiceConfig : EntityTypeConfiguration<Invoice>
{
    public InvoiceConfig()
    {
        this.Map(m => { m.MapInheritedProperties(); m.ToTable("Invoices"); });
    }
}
Run Code Online (Sandbox Code Playgroud)

PeriodicInvoice 类及其配置:

public class PeriodicInvoice : InvoiceBase
{
    // Some extra properties.
} 

public class PeriodicInvoiceConfig : EntityTypeConfiguration<PeriodicInvoice>
{
    public PeriodicInvoiceConfig()
    {
       this.Property(x => x.SuspendOnExpire).IsRequired();
       this.Map(m => { m.MapInheritedProperties(); m.toTable("PeriodicInvoices"); });
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行代码时,会出现此错误:

实体类型"发票"和"人员"之间的关联"Invoice_User"无效.在TPC层次结构中,仅允许在大多数派生类型上使用独立关联.

我知道这意味着我应该将属性包含在User …

c# entity-framework ef-code-first ef-fluent-api

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

EF Code First属性到同一个表

我是EF的新手并且正在努力实现以下场景.我有一个实体,我想要一个导航属性到另一个相同的实体.例如

public class Stage {
    public int ID { get; set; }
    public int? NextStageID { get; set; }
    public string Name { get; set; }

    public virtual Stage NextStage { get; set;}
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我发现的唯一例子是实体具有父/子关系,即导航属性是同一实体的ICollection.我试过调整它但是无法让它在我的实例中工作.此外,我只需要它是一种方式,即实体没有'PreviousStage'属性,只有'NextStage'属性.我正在使用Fluent API进行配置.有人可以建议是否/如何实现这一目标?

我收到此错误:

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

编辑 刚刚在我的略微简化的例子中实现,我没有表明NextStageID是可选的(int?).

c# entity-framework ef-fluent-api

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

EF Fluent Api可以设置最小长度吗?

看来使用Fluent API具有更大的灵活性.

所以我选择跟随的方式总是使用Fluent API来确定它在db中具有的功能而不是使用注释.

但问题是,我找不到设置最小长度的方法.有没有办法执行此操作?

我注意到,没有太多话题讨论这种方式.Fluent API方式很受欢迎吗?

希望我们选择正确的一面.

.net orm entity-framework ef-fluent-api

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

Entity-framework-7将Fluent API配置组织到一个单独的类中

我很熟悉如何将流畅的API配置组织到EF6上的单独类中,但是如何通过EF7实现这一点?

以下是如何使用EF6执行此操作的示例:

ModelConfigurations.cs

public class ModelConfigurations : EntityTypeConfiguration<Blog>
{
     ToTable("tbl_Blog");
     HasKey(c => c.Id);
// etc..
}
Run Code Online (Sandbox Code Playgroud)

并从OnModelCreating()调用它

    protected override void OnModelCreating(DbModelbuilder modelBuilder)
    {
          modelBuilder.Configurations.Add(new ModelConfigurations());
// etc...
    }
Run Code Online (Sandbox Code Playgroud)

在EF7上,我无法解析EntityTypeConfiguration?从单独的类实现流畅的API调用的正确方法是什么?

c# entity-framework ef-fluent-api

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

如何以一对一/零关系指定外键?

我有一个父实体和一个子实体。

在数据库中,父级的主键是p_p_id ,子级中的外键是相同的p_p_id

数据库中没有外键约束。

实体具有在各自的类中设置的指向彼此的属性。

家长班

public virtual ChildProject ThisChildProject { get; set; }
Run Code Online (Sandbox Code Playgroud)

儿童班

public virtual ParentProject ThisParentProjection { get; set; }
Run Code Online (Sandbox Code Playgroud)

这些属性或任何一个类的Id上都没有注释。

在配置中,我尝试在子级中进行映射。

HasRequired(i => i.ThisParentProject).WithOptional(o => o.ThisChildProject );
Run Code Online (Sandbox Code Playgroud)

发生的情况是EF尝试使用子级的主键和父级的主键进行映射。

但是我想在子级和父级的主键中使用定义的FK

c# entity-framework ef-fluent-api

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

使用Fluent Api时,复合键EF Core收到错误

所以我在Entity Framework Core中有以下类.我正在尝试进行代码优先迁移,并且不能在我的生活中弄清楚如何为这项工作制作流畅的API.

public class Participants
{
    public Activity Activity { get; set; } //Class with Id and Name of Activity
    public ApplicationUser Participant { get; set; } 

    [Key]
    [Column(Order = 1)]
    public int ActivityId { get; set; }


    [Key]
    [Column(Order = 2)]
    public string ParticipantId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在EF6中,我能够在OnModelCreating中执行此操作以使其正常工作.

 modelBuilder.Entity<Attendance>()
            .HasRequired(a => a.Activity)
            .WithMany()
            .WillCascadeOnDelete(false);
Run Code Online (Sandbox Code Playgroud)

但在EF Core我得到了

"实体类型'参与者'具有使用数据注释定义的复合主键.要设置复合主键,请使用流畅的API."

我试过用

modelBuilder.Entity<Participants>().HasKey(p => new {p.Activity, p.Participant});
Run Code Online (Sandbox Code Playgroud)

但是,这只会导致

在表'参与者'上引入FOREIGN KEY约束'FK_Participants_AspNetUsers_ParticipantId'可能会导致循环或多个级联路径.指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束.

如果有更好的方法来完成整个事情,我愿意接受建议.如果您有多个订阅,我基本上是想让Mosh Hamedani的"成为一个完整的堆栈开发者"在EF核心工作.该示例位于"13-full-stack-fundamentals"文件夹中.

更新:也尝试过 …

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

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

在EF 6中找不到HasOne

我是Entity Framework的新手,我正试图找出关系.我找到了这段代码:

class MyContext : DbContext
{
    public DbSet<Post> Posts { get; set; }
    public DbSet<Tag> Tags { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<PostTag>()
            .HasKey(t => new { t.PostId, t.TagId });

        modelBuilder.Entity<PostTag>()
            .HasOne(pt => pt.Post)
            .WithMany(p => p.PostTags)
            .HasForeignKey(pt => pt.PostId);

        modelBuilder.Entity<PostTag>()
            .HasOne(pt => pt.Tag)
            .WithMany(t => t.PostTags)
            .HasForeignKey(pt => pt.TagId);
    }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework ef-fluent-api

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

在OnModelCreating中撤消HasIndex

我正在尝试使用Identity Framework Core配置多租户应用程序.

我已成功创建了一个自定义ApplicationUser,使用TenantId覆盖IdentityUser,使用以下说明:https://www.scottbrady91.com/ASPNET-Identity/Quick-and-Easy-ASPNET-Identity-Multitenancy (这些说明不适用于Identity Framework核心,但他们帮助).

我在创建数据库表时陷入困境.

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);
    builder.Entity<Models.User>(entity =>
    {
        entity.HasIndex(a => new { a.NormalizedUserName, a.TenantId }).HasName("UserNameIndex").IsUnique();
    });
}
Run Code Online (Sandbox Code Playgroud)

我的意图是替换base.OnModelCreating()中定义的UserNameIndex,以便它是两列而不仅仅是NormalizedUsername的索引.但这只会导致错误:

'User'上的索引{'NormalizedUserName','TenantId'}和'User'上的{'NormalizedUserName'}都映射到'Security.AspNetUser.UserNameIndex'但具有不同的列({'NormalizedUserName','TenantId'}和{'NormalizedUserName'}).

显然我想在我在代码中添加它之前撤消在base.OnModelCreating()调用中创建的索引,但是找不到这样做的方法.

有没有办法从ModelBuilder中删除已在模型创建链中进一步创建的索引?

c# entity-framework asp.net-identity ef-fluent-api

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

EF Core:当 IDENTITY_INSERT 在一对多上设置为 OFF 时,无法为表中的标识列插入显式值

我将 EF Core 和 ASP NET Core 用于我的服务器,当我尝试更新数据库中的现有值时,我收到以下错误:

当 IDENTITY_INSERT 设置为 OFF 时,无法为表“TeambuildingType”中的标识列插入显式值。

我正在做的是这样的:

  1. 创建一个 Teambuilding 元素,最初将 TeamBuildingTypeId 的外键设置为 NULL

  2. 使用 INSERT INTO .... 直接从 SQL Management Studio 创建两个 TeambuildingType(对于 Teambuilding 和 TeambuildingType,Id 自动递增)

  3. 尝试通过添加 TeambuildingTypeId 来更新现有 Teambuilding,如下所示:team.TeambuildingTypeId = 1 或 team.Type =(从数据库中获取的对象在同一上下文中)

  4. 在捕获中从上面接收错误

这是我的代码:

团队建设.cs

public class TeamBuilding
{
    [Key]
    public int Id { get; set; }
    public string Title { get; set; }

    public DateTime StartDate { get; set; }

    public DateTime EndDate { get; set; }

    public …
Run Code Online (Sandbox Code Playgroud)

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

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

Fluent API 中具有常量的外键

我需要从数据库加载一个 reqired:many 关系。现在我的问题是,相关表的键由三个键组成:

public partial class EnumValue
{
    [Key]
    [Column(Order = 0)]
    [StringLength(14)]
    public string EnumGroup { get; set; }

    [Key]
    [Column(Order = 1)]
    public byte EnumId { get; set; }

    [Key]
    [Column(Order = 2)]
    [StringLength(3)]
    public string Language { get; set; }

    [StringLength(50)]
    public string Description { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

在我的另一个对象中,我只有一个属性来填充外键,其他部分是特定于此对象的常量。
我尝试在 EF6 中构建关系,但无法使用常量而不是属性使其与模型构建器和 Fluent API 一起使用:

modelBuilder.Entity<SupplierCondition>()                
    .HasRequired(t => t.ConditionTypeLookupRef)
    .WithMany()
    .HasForeignKey(t => new { "PArt", t.ConditionType, "EN" });
Run Code Online (Sandbox Code Playgroud)

如何在 Fluent API 中将常量作为外键的值传递?

c# sql-server entity-framework ef-fluent-api

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