C# ef代码首先将一个表映射到一些实体

C# ef代码首先将一个表映射到一些实体,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我试图解决以下问题: 在实体HRCard和BPCard中,我有属性 public int DefaultAddressId { get; set; } [ForeignKey("DefaultAddressId")] public AddressDetail Address { get; set; } // table AddressDetail 到目前为止没有问题,现在我的问题是: 在BPCard中,我还有一个属性: public virtual ICollection<Addres

我试图解决以下问题:

在实体HRCardBPCard中,我有属性

public int DefaultAddressId { get; set; }

[ForeignKey("DefaultAddressId")]
public AddressDetail Address { get; set; } // table AddressDetail
到目前为止没有问题,现在我的问题是: 在BPCard中,我还有一个属性:

public virtual ICollection<AddressDetail> Addresses { get; set; } //table AddressDetail
公共虚拟ICollection地址{get;set;}//表地址详细信息
以下是完整的代码:

public abstract class EntityBase : IEntityModel {
[Key]
public int EntityId { get; set; }

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

//...
}

// table HRCards
public class HRCard : EntityBase {
//Id from base class
// working fine
//...

public int DefaultAddressId { get; set; }

[ForeignKey("DefaultAddressId")]
public AddressDetail Address { get; set; } // table AddressDetail
}

// table BPCards
public class BPCard : EntityBase {
//Id from base class
// working fine
//...
public int DefaultAddressId { get; set; }
public int DefaultContactId { get; set; }

//working fine
[ForeignKey("DefaultAddressId")]
public AddressDetail DefaultAddress { get; set; } //table AddressDetail

//how can i solve this??
// table AddressDetail
public virtual ICollection<AddressDetail> Addresses { get; set; } 
}

public class AddressDetail : EntityBase {
//Id from base class
// working fine
//...
public int ParentId { get; set; }
}
公共抽象类EntityBase:IEntityModel{
[关键]
public int EntityId{get;set;}
[必需]
[长度(50)]
公共字符串EntityKey{get;set;}
//...
}
//表HR卡
公共类HR卡:EntityBase{
//来自基类的Id
//工作正常
//...
public int DefaultAddressId{get;set;}
[ForeignKey(“DefaultAddressId”)]
公共地址详细信息地址{get;set;}//表地址详细信息
}
//表BP卡
公共类BPCard:EntityBase{
//来自基类的Id
//工作正常
//...
public int DefaultAddressId{get;set;}
public int DefaultContactId{get;set;}
//工作正常
[ForeignKey(“DefaultAddressId”)]
public AddressDetail DefaultAddress{get;set;}//表AddressDetail
//我怎样才能解决这个问题??
//表地址详细信息
公共虚拟ICollection地址{get;set;}
}
公共类地址详细信息:EntityBase{
//来自基类的Id
//工作正常
//...
public int ParentId{get;set;}
}
我已经搜索了很长时间,但没有结果真正解决我的问题。我的第一个解决方案是将表拆分为HRAddress和BPAddress,这很好

编辑: 如果我开始启用迁移,我会收到一条错误消息:

“无法将属性‘ParentId’配置为导航属性。该属性必须是有效的实体类型,并且该属性应具有非抽象的getter和setter。对于集合属性,该类型必须实现ICollection,其中T是有效的实体类型。”

非常感谢

附言:
我可以稍后更改标记以获得更好的映射吗?

这取决于您希望与地址POCO的预期关系

您可以使用注释解决这种关系,例如

public class AddressDetail : EntityBase {
//Id from base class

public virtual ICollection<BPCard> Addresses { get; set; } 
//public virtual BPCard Addresses { get; set; } 
public virtual ICollection<HRCard> Addresses { get; set; } 
//public virtual BPCard Addresses { get; set; } 
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
        //one-to-many
        modelBuilder.Entity<HRCard>()
                    .HasMany<AddressDetails>(s => s.Id)
                    .WithRequired(s => s.HRCard)
                    .HasForeignKey(s => s.AddressId);
}
公共类地址详细信息:EntityBase{
//来自基类的Id
公共虚拟ICollection地址{get;set;}
//公共虚拟BP卡地址{get;set;}
公共虚拟ICollection地址{get;set;}
//公共虚拟BP卡地址{get;set;}
}
或者直接在你的模型上

public class AddressDetail : EntityBase {
//Id from base class

public virtual ICollection<BPCard> Addresses { get; set; } 
//public virtual BPCard Addresses { get; set; } 
public virtual ICollection<HRCard> Addresses { get; set; } 
//public virtual BPCard Addresses { get; set; } 
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
        //one-to-many
        modelBuilder.Entity<HRCard>()
                    .HasMany<AddressDetails>(s => s.Id)
                    .WithRequired(s => s.HRCard)
                    .HasForeignKey(s => s.AddressId);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
//一对多
modelBuilder.Entity()
.HasMany(s=>s.Id)
.带必填项(s=>s.HRCard)
.HasForeignKey(s=>s.AddressId);
}

不清楚问题出在哪里,也不清楚您想实现什么。我先使用代码,迁移工具运行时出错//我怎样才能解决这个问题??公共虚拟ICollection地址{get;set;}@faceofini哪个错误?请在您的问题中编辑它。我不清楚问题出在哪里。你能添加错误文本和你想要的结果吗?我已经编辑了我的问题并添加了我的错误。好吧,我很困惑????每次迁移工具抛出execption时。现在它可以与我发布的代码一起工作了!我认为这是用户层的第8层问题;)谢谢