gpt4 book ai didi

entity-framework - 如何将一个代码第一个对象中的两个属性映射到相同的父类型

转载 作者:行者123 更新时间:2023-12-02 00:11:46 25 4
gpt4 key购买 nike

我已经在这里工作了几个小时,并尝试了很多我在搜索时发现的建议,但没有成功。我正在使用代码优先 EF 5。

情况是我有一个 Employee 类。然后我有另一个类,它有两个属性,都是 Employee 类型。我希望这两个都是外键约束,但要求允许来自相同用户的许多相同请求,所以我不能只将它们用作键。我真的不关心 Employee 是否有两个用于导航的集合,但在我解决这个问题时,这似乎是一个要求。如果它简化了问题,我可以删除它们。

我收到这条消息。System.Data.Entity.Edm.EdmAssociationEnd::多重性在关系“Employee_RequestsForEmployee”中的角色“Employee_RequestsForEmployee_Target”中无效。由于Dependent Role属性不是关键属性,Dependent Role的重数上限必须是'*'。

我已经在上下文的 OnModelCreation 方法中使用 Fluent API 进行了尝试;

modelBuilder.Entity() .HasRequired(u => u.ForEmployee) .WithMany() .HasForeignKey(u => u.ForEmployeeId);

        modelBuilder.Entity<RevenueTransferRequest>()
.HasRequired(u => u.FromEmployee)
.WithMany()
.HasForeignKey(u => u.FromEmployeeId);

冲突的类是(为了清楚起见,我删除了一些属性);

    public class Employee : IEmployee
{
[Key]
public string Id { get; set; }

[InverseProperty("ForEmployee")]
public ICollection<RevenueTransferRequest> RequestsForEmployee { get; set; }

[InverseProperty("FromEmployee")]
public ICollection<RevenueTransferRequest> RequestsFromEmployee { get; set; }
}

public class RevenueTransferRequest : IRevenueTransferRequest
{
[Key]
public Guid Id { get; set; }

[Required]
[ForeignKey("ForEmployee")]
public String ForEmployeeId { get; set; }

[InverseProperty("RequestsForEmployee")]
public Employee ForEmployee { get; set; }

[Required]
[ForeignKey("FromEmployee")]
public String FromEmployeeId { get; set; }

[InverseProperty("RequestsFromEmployee")]
public Employee FromEmployee { get; set; }
}

任何帮助将不胜感激。提前致谢。

最佳答案

我从来没有弄清楚如何使用数据注释来做到这一点,但使用 Fluent API 我能够做到这一点。我缺少的是我必须在 HasMany() 方法中指定我认为通过数据注释和约定可以理解的另一侧关系。

这在 DbContext OnModelCreating 覆盖中调用(WillCascadeOnDelete(false) 与另一个问题相关)。

    modelBuilder.Entity<RevenueTransferRequest>()
.HasRequired(e => e.FromEmployee)
.WithMany(x=>x.RequestsFromEmployee)
.WillCascadeOnDelete(false);

modelBuilder.Entity<RevenueTransferRequest>()
.HasRequired(e => e.ForEmployee)
.WithMany(x => x.RequestsForEmployee)
.WillCascadeOnDelete(false);

与类:

[Key]
public String Id { get; set; }

public String BusinessUnitLeaderId { get; set; }

public Employee BusinessUnitLeader { get; set; }

[Required]
[MaxLength(150)]
public String DisplayName { get; set; }

public ICollection<Project> BusinessUnitLeaderProjects { get; set; }

public ICollection<RevenueTransferRequest> RequestsForEmployee { get; set; }

public ICollection<RevenueTransferRequest> RequestsFromEmployee { get; set; }

public class RevenueTransferRequest
{
[Key]
public Guid Id { get; set; }

[Required]
public String ForEmployeeId { get; set; }

public Employee ForEmployee { get; set; }

[Required]
public String FromEmployeeId { get; set; }

public Employee FromEmployee { get; set; }

[Required]
public String ProjectId { get; set; }

public Project Project { get; set; }

[Required]
public Double? TransferAmount { get; set; }

public int WorkflowState { get; set; }
}

关于entity-framework - 如何将一个代码第一个对象中的两个属性映射到相同的父类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14866615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com