使用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 …
我是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?).
看来使用Fluent API具有更大的灵活性.
所以我选择跟随的方式总是使用Fluent API来确定它在db中具有的功能而不是使用注释.
但问题是,我找不到设置最小长度的方法.有没有办法执行此操作?
我注意到,没有太多话题讨论这种方式.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调用的正确方法是什么?
我有一个父实体和一个子实体。
在数据库中,父级的主键是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
所以我在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
我是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) 我正在尝试使用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中删除已在模型创建链中进一步创建的索引?
我将 EF Core 和 ASP NET Core 用于我的服务器,当我尝试更新数据库中的现有值时,我收到以下错误:
当 IDENTITY_INSERT 设置为 OFF 时,无法为表“TeambuildingType”中的标识列插入显式值。
我正在做的是这样的:
创建一个 Teambuilding 元素,最初将 TeamBuildingTypeId 的外键设置为 NULL
使用 INSERT INTO .... 直接从 SQL Management Studio 创建两个 TeambuildingType(对于 Teambuilding 和 TeambuildingType,Id 自动递增)
尝试通过添加 TeambuildingTypeId 来更新现有 Teambuilding,如下所示:team.TeambuildingTypeId = 1 或 team.Type =(从数据库中获取的对象在同一上下文中)
在捕获中从上面接收错误
这是我的代码:
团队建设.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) 我需要从数据库加载一个 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 中将常量作为外键的值传递?