繁体   English   中英

实体框架代码优先-相同类型的2个实体

[英]Entity Framework Code First - 2 Entities of the Same Type

我试图在实体中映射2个相同类型的属性,并得到此错误:

An exception was thrown while executing a resolve operation. See the InnerException for details. ---> Introducing FOREIGN KEY constraint 'FK_dbo.Client_dbo.Messagebox_OutboxId' on table 'Client' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

无法创建约束。 请参阅先前的错误。 (有关详细信息,请参见内部异常。)

我知道这个错误与我拥有2个相同类型的道具有关。

如何使用代码优先+ EF Fluent API来完成?

方案:每个Client都有InboxOutbox ,它们都是Messagebox

 public class BaseEntity
{
    public int Id { get; set; }
}

public class Client : BaseEntity
{
    /// <summary>
    /// Gets or sets Client Alias
    /// </summary>
    public string Alias { get; set; }

    /// <summary>
    /// Gets or sets value indicating if the client was deleted
    /// </summary>
    public bool Deleted { get; set; }

    /// <summary>
    /// Gets or sets client's inbox
    /// </summary>
    public virtual Messagebox Inbox { get; set; }

    /// <summary>
    /// Gets or sets inbox Id
    /// </summary>
    public int InboxId { get; set; }

    /// <summary>
    /// Gets or sets client's outbox
    /// </summary>
    public virtual Messagebox Outbox { get; set; }

    /// <summary>
    /// Gets or sets outbox Id
    /// </summary>
    public int OutboxId { get; set; }
}

public class Messagebox : BaseEntity
{
    public int ClientId { get; set; }

    /// <summary>
    /// Gets or sets the messagebox client
    /// </summary>
    public virtual Client Client { get; set; }
}

此问题与使用两个具有相同名称的专家无关。 它与不愿创建表之间循环的约束的sql数据库有关。

您可以使用以下流畅的API来克服这一问题(请根据需要进行调整)

modelBuilder.Entity<Leaves>().HasRequired(l => l.Applicant)
                            .WithMany(bp => bp.LeavesToApply)
                            .HasForeignKey(l => l.ApplicantId)
                            .WillCascadeOnDelete(false);
modelBuilder.Entity<Leaves>().HasOptional(t => t.Approver)
                             .WithMany(bp => bp.LeavesToApprove)
                             .HasForeignKey(u => u.ApproverId)
                             .WillCascadeOnDelete(false);

问题是您必须转向Cascade。 并手动删除事物或删除循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM