- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我首先使用代码,然后使用 TPT 继承。正在生成实体的基本类型表,但其主键上没有标识。 (如果有帮助,我可以发布代码)我的个人表有一个主键,但没有“是身份”。子类表按预期生成。
由于它没有为基本类型生成主键,我尝试将 HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
添加到 Map,这破坏了模型,我收到一条错误消息:
Conflicting configuration settings were specified for property 'Id' on type 'Orion.Data.Entities.Person': DatabaseGeneratedOption = None conflicts with DatabaseGeneratedOption = Identity.
我已经搜索了可能为该属性指定“DatabaseGeneratedOption.None”的任何地方,但它不在我的代码中。我认为这是 EF6 中的配置约定。我试过调试 .net 以找出它的问题所在,但没有成功。
所以问题是,什么约定可能导致我可以禁用它?还是这里有其他事情在起作用?
编辑:基础映射:
public abstract partial class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class PersonMap : EntityTypeConfiguration<Person>
{
public PersonMap()
{
// Primary Key
this.HasKey(t => t.Id);
// Properties
this.Property(t => t.FirstName)
.IsRequired()
.HasMaxLength(25);
this.Property(t => t.LastName)
.IsRequired()
.HasMaxLength(25);
this.ToTable("People");
this.Property(t => t.Id).HasColumnName("Id");
//this.Property(t=>t.Id).HasColumnName("Id").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
this.Property(t => t.FirstName).HasColumnName("FirstName");
this.Property(t => t.LastName).HasColumnName("LastName");
// Relationship
this.HasOptional(x => x.User)
.WithRequired(x => x.Person).WillCascadeOnDelete(false);
this.HasMany(a => a.Addresses).WithOptional().WillCascadeOnDelete(true);
}
}
继承类:
public partial class ClientRep : Person
{
public ClientRep()
{
this.Jobs = new ObservableCollection<Job>();
}
public int ClientId { get; set; }
public bool? IsPrimaryContact { get; set; }
public string JobContactType { get; set; }
public Client Client { get; set; }
public ICollection<Job> Jobs { get; set; }
}
public class ClientRepMap : EntityTypeConfiguration<ClientRep>
{
public ClientRepMap()
{
this.HasKey(t => t.Id);
this.Property(t => t.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
this.ToTable("People_ClientRep");
this.Property(t => t.ClientId).HasColumnName("ClientId");
this.Property(t => t.IsPrimaryContact).HasColumnName("IsPrimaryContact");
this.Property(t => t.JobContactType).HasColumnName("JobContactType");
this.Property(t => t.Id).HasColumnName("Id");
this.HasMany(t => t.Jobs)
.WithMany(t => t.ClientReps)
.Map(m =>
{
m.ToTable("JobClientRep");
m.MapLeftKey("ClientRep_Id");
m.MapRightKey("Job_Id");
});
this.HasRequired(t => t.Client)
.WithMany(t => t.ClientReps)
.HasForeignKey(d => d.ClientId).WillCascadeOnDelete(false);
}
}
然后在我的 DbContext 中:
public partial class ProgramDbContext : DbContext, IProgramDbContext
{
static OrionDbContext()
{
Database.SetInitializer(new OrionContextSeedInitializer());
}
public OrionDbContext()
: base("ConnectionString")
{
this.Configuration.LazyLoadingEnabled = false;
this.Configuration.ProxyCreationEnabled = false;
}
//No DbSet for Person
public IDbSet<ClientRep> ClientRep { get; set; }
public IDbSet<ContactPerson> ContactPerson { get; set; }
public IDbSet<OtherPerson1> OtherPerson1{ get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//modelBuilder.Conventions.AddBefore<StoreGeneratedIdentityKeyConvention>(new InheritanceKeyConvention());
//modelBuilder.Conventions.Remove<StoreGeneratedIdentityKeyConvention>();
//abridged
modelBuilder.Configurations.Add(new PersonMap());
modelBuilder.Configurations.Add(new ClientRepMap());
modelBuilder.Configurations.Add(new ContactPersonMap());
modelBuilder.Configurations.Add(new OtherPerson1Map());
//modelBuilder.Entity<Person>()
// .Property(a => a.Id)
// .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
}
它似乎与 StoreGeneratedIdentityKeyConvention
有关 - 它似乎将身份分配给我的所有其他实体,但这个不明白......我认为这与它有关抽象类。我试图用以下方法覆盖该配置:
modelBuilder.Entity<Person>()
.Property(a => a.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
但还是有冲突。
最佳答案
好吧,那是 8 个小时的荒谬冒险!
背景:我首先通过对现有数据库进行逆向工程来导入代码。
这生成了我的继承实体,使其具有主键,但没有标识。我删除了所有到 Id 属性的映射,因为它不存在于继承的实体上,只存在于基础上。 (现在这一切都变得更有意义了……哎呀,真是浪费了一天!)
我继承的类和映射现在看起来像这样:
public partial class ClientRep : Person
{
public ClientRep()
{
this.Jobs = new ObservableCollection<Job>();
}
public int ClientId { get; set; }
public bool? IsPrimaryContact { get; set; }
public string JobContactType { get; set; }
public Client Client { get; set; }
public ICollection<Job> Jobs { get; set; }
}
public class ClientRepMap : EntityTypeConfiguration<ClientRep>
{
public ClientRepMap()
{
this.ToTable("People_ClientRep");
this.Property(t => t.ClientId).HasColumnName("ClientId");
this.Property(t => t.IsPrimaryContact).HasColumnName("IsPrimaryContact");
this.Property(t => t.JobContactType).HasColumnName("JobContactType");
this.HasMany(t => t.Jobs)
.WithMany(t => t.ClientReps)
.Map(m =>
{
m.ToTable("JobClientRep");
m.MapLeftKey("ClientRep_Id");
m.MapRightKey("Job_Id");
});
this.HasRequired(t => t.Client)
.WithMany(t => t.ClientReps)
.HasForeignKey(d => d.ClientId).WillCascadeOnDelete(false);
}
}
一旦我从逆向工程中删除了这些残余物,一切都会按需生成。
关于c# - TPT 基类主键身份约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27068384/
在我的项目中,我使用 TPT 作为测试环境,我们使用基于模型的测试。代码覆盖率通常在 80% 左右。但是客户要求100%的覆盖率,所以想用.c和.h文件进行测试。 我是这类测试的新手,因为我们只进行了
我首先使用代码,然后使用 TPT 继承。正在生成实体的基本类型表,但其主键上没有标识。 (如果有帮助,我可以发布代码)我的个人表有一个主键,但没有“是身份”。子类表按预期生成。 由于它没有为基本类型生
我正在编写一个使用继承的应用程序,我试图将其映射到具有 TPT 结构的 SQL Server 数据库。 但是,出于某种原因,EF 在父类(super class)表和子类表中生成了重复的外键。 我有这
我在我的数据库中创建了大量的表,以下是有问题的表: Table Name -Item ItemID - PK (Auto Increment) Title Table N
我正在尝试使用 TPT java api 来实现项目的一些自动化。 并尝试使用函数“generateTestCasesFromTestData”“添加步骤列表”但无法弄清楚从哪里获取其第一个参数“Sc
如何确定具有 TPT 继承的实体的子类型? 如果我有一个基类 Person 和两个子类 Manager 和 Customer,应该可以查询所有的人,然后通过使用 GetType 方法按他们的子类分组,
我有一个带有 TPT 继承映射的项目,现在我需要给它添加一个搜索功能,以便在多个表中查找记录。这就是我目前拥有的: public abstract class Customer { publi
我们正在使用 C# MVC .NET4。 EF5(代码优先)。 我们正在尝试构建一个系统,该系统应动态允许用户将额外属性“附加”到任何实体。 假设我们有 ProductClass 和 Products
我的域实体正在使用 EF Table Per Type Inheritance,这是关系。 如您所见,发票位于父实体 Order.cs 上。这让我现在在处理发票时遇到问题。 例如,要创建发票,我需要将
我有这个数据库结构: 服务 Id 整数 PK CategoryId FK 一些其他领域 本地化服务 LocalizedServiceId 公钥 LanguageId FK 姓名 描述 如您所见,我有一
我将 EF 与代码优先和 TPT(每个类型的表)继承结合使用。我有以下模型: public partial class AccountHolder { public int AccountHo
概览 我首先使用实体框架 4.3 代码和流畅的界面来设置我的 DbContext。我有一个基 Item 类,其中包含继承它的其他类型,例如 Event、BlogPost、ForumThread、W
在 Entity Framework 的早期版本中,在使用 Table per Type 继承时存在一些严重的性能问题,如下所述: http://www.codeproject.com/Article
考虑以下具有 TPT 继承的 Entity Framework 模型。 数据库表: Person (PersonID, Name) Student (PersonID, Grade) EF 实体: P
我试图达到的是使用 TPT 继承的 AbstractUser 和 Plant 之间的 NM 关系。 当我尝试配置关系时, modelBuilder.Entity().HasMany(c => c.Re
我们的系统正在接收来自两个外部来源的输入(电话/网络提交)。 // Table-Per-Type Hierarchy public class Submission { public int
我有一个关于 TPT + EF6 的大问题。 在我的数据库模型中,我有一张表 Person(我的应用程序中人员的基本信息),并且我有用于 Supplier 和 Consumer 的表. 我的类(cla
我想在 EF 中实现以下模型作为 TPT 设计。 我的代码如下: 基础型号 public abstract class Product { public int Id { get; set;
这个问题会围绕Account、IndividualAccount、Doctor这3个class进行说明: 前两个类是抽象的 IndividualAccount 是 Account 的子类 Doctor
针对遗留数据库使用 Entity Framework 4.1,我无法生成工作的 TPT 继承模型集,这些模型没有复数化并且对公共(public)主键使用不同的名称。 我正在使用数据库表 Organiz
我是一名优秀的程序员,十分优秀!