错误0019:类型中的每个属性名称在ID字段上必须是唯一的

时间:2011-10-03 21:44:23

标签: entity-framework-4.1 ef-code-first

已回答!(很快就会发布。我认真地认为这是EF中的一个错误。)

我有以下一组(代码优先)类,这将是应用程序的未来,因为我们正在替换旧的(gen'd from db)。 dbcontext,两个映射/配置,两个POCO和一个基类。

除了这个在另一个项目中,完全是从数据库生成的edmx。到目前为止,两个冲突没有任何问题。在上下文中还有其他几个不相关的集合(未显示),但直到我开始尝试获得SalesRepsSalesGroups之间的关系才开始出现问题。评论在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属性的映射将允许创建模型。但这并不会对长期有所帮助。

1 个答案:

答案 0 :(得分:1)

错误是EF的问题。

在映射中,我映射Property(p=>p.Id).HasColumnName("MyId");

在我的继承自Entity类的Contact类中,还有ID。

因为我没有显式地映射这些列,所以映射“逐渐减少”并且试图以相同的方式映射我的Contact.Id属性。

<强>解决方案:

a)明确地映射

b)删除继承,以使Contact不是Entity类型,而是ComplexType(没有ID。)