已回答!(很快就会发布。我认真地认为这是EF中的一个错误。)
我有以下一组(代码优先)类,这将是应用程序的未来,因为我们正在替换旧的(gen'd from db)。 dbcontext,两个映射/配置,两个POCO和一个基类。
除了这个在另一个项目中,完全是从数据库生成的edmx。到目前为止,两个冲突没有任何问题。在上下文中还有其他几个不相关的集合(未显示),但直到我开始尝试获得SalesReps
和SalesGroups
之间的关系才开始出现问题。评论在SalesGroupMapping
中添加OnModelCreating
将允许其运行。
错误:
Schema specified is not valid. Errors:
(19,6) : error 0019: Each property name in a type must be unique. Property name 'PKID_MasterRepGroup' was already defined.
(27,6) : error 0019: Each property name in a type must be unique. Property name 'PKID_MasterRepGroup' was already defined.
守则:
public class MyDbContext{
public IDbSet<SalesGroup> SalesGroups { get; set; }
public IDbSet<SalesRep> SalesReps { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new InsuranceProviderMapping());
modelBuilder.Configurations.Add(new SalesGroupMapping());
modelBuilder.Configurations.Add(new SalesRepMapping());
base.OnModelCreating(modelBuilder);
}
}
class SalesRepMapping : EntityTypeConfiguration<SalesRep>
{
public SalesRepMapping()
{
ToTable("SalesRep");
Property(p => p.Id).HasColumnName("PKID_SalesRep");
Property(p => p.Email).HasColumnName("EMailAddress1");
Property(p => p.Address.Address1).HasColumnName("Address");
Property(p => p.Address.Address2).HasColumnName("Address2");
Property(p => p.Address.City).HasColumnName("City");
Property(p => p.Address.State).HasColumnName("State");
Property(p => p.Address.Zipcode).HasColumnName("Zipcode");
//Property(p => p.SalesGroupId).HasColumnName("FK_MasterRepGroup");
//HasRequired(p => p.SalesGroup).WithMany(c => c.SalesReps).HasForeignKey(b => b.SalesGroupId);
//Note: dropping emailaddress2
}
}
class SalesGroupMapping : EntityTypeConfiguration<SalesGroup>
{
public SalesGroupMapping()
{
ToTable("MasterRepGroup");
Property(p => p.Id).HasColumnName("PKID_MasterRepGroup");
Property(p => p.Name).HasColumnName("CompanyName");
Property(p => p.PrimaryContact.FirstName).HasColumnName("Contact1FirstName");
Property(p => p.PrimaryContact.LastName).HasColumnName("Contact1LastName");
Property(p => p.PrimaryContact.Phone).HasColumnName("Contact1Phone");
Property(p => p.PrimaryContact.Fax).HasColumnName("Contact1Fax");
Property(p => p.PrimaryContact.Email).HasColumnName("Contact1EMail");
Property(p => p.SecondaryContact.FirstName).HasColumnName("Contact2FirstName");
Property(p => p.SecondaryContact.LastName).HasColumnName("Contact2LastName");
Property(p => p.SecondaryContact.Phone).HasColumnName("Contact2Phone");
Property(p => p.SecondaryContact.Fax).HasColumnName("Contact2Fax");
Property(p => p.SecondaryContact.Email).HasColumnName("Contact2EMail");
Property(p => p.Address.Address1).HasColumnName("Address");
Property(p => p.Address.Address2).HasColumnName("Address2");
Property(p => p.Address.City).HasColumnName("City");
Property(p => p.Address.State).HasColumnName("State");
Property(p => p.Address.Zipcode).HasColumnName("Zipcode");
}
}
public class SalesRep: Entity
{
virtual public string FirstName { get; set; }
[Required]
public string LastName { get; set; }
[Phone]
virtual public string Phone { get; set; }
[Phone]
virtual public string Fax { get; set; }
[Email]
virtual public string Email { get; set; }
virtual public string Notes { get; set; }
virtual public Address Address { get; set; }
//public long SalesGroupId { get; set; }
//[Required]
////[ForeignKey("SalesGroupId")]
//virtual public SalesGroup SalesGroup { get; set; }
}
public class SalesGroup : Entity
{
public SalesGroup()
{
//SalesReps = new List<SalesRep>();
}
[Required]
public string Name { get; set; }
virtual public Address Address { get; set; }
virtual public Contact PrimaryContact { get; set; }
virtual public Contact SecondaryContact { get; set; }
//virtual public ICollection<SalesRep> SalesReps {get; set;}
}
public abstract class Entity : NMTC.Core.DataContracts.IEntity
{
// TODO database columns will eventually be int instead of bigint
public long Id { get; set; }
}
}
有什么想法吗?自星期五以来,我一直在敲打这个。如果你知道一种方法我可以追踪它的想法,那也会有所帮助。
非常感谢。
更多信息:
单独注释Id属性的映射将允许创建模型。但这并不会对长期有所帮助。
答案 0 :(得分:1)
错误是EF的问题。
在映射中,我映射Property(p=>p.Id).HasColumnName("MyId");
在我的继承自Entity
类的Contact类中,还有ID。
因为我没有显式地映射这些列,所以映射“逐渐减少”并且试图以相同的方式映射我的Contact.Id
属性。
<强>解决方案:强>
a)明确地映射
b)删除继承,以使Contact
不是Entity
类型,而是ComplexType
(没有ID。)