簡體   English   中英

配置多個一對一關系的正確方法是什么?

[英]What is the proper way to configure multiple one-to-one relationship?

我有一個實體 DbDropPhoto、DbReferencePhoto 和 DbSimpleLine。 DbSimpleLine 可以以三種不同的狀態存儲在數據庫中:DropPhotoHorizo​​ntalLine、DropPhotoVerticalLine、DbReferencePhoto。 這些狀態中的每一個都相互抵消。 例如,作為 DropPhotoVerticalLine 的 SimpleLine,會將 DropPhotoHorizo​​ntalLine 和 DbReferencePhoto 設置為 null:

[Table("DropPhotos")]
    public class DbDropPhoto
    {
        [Key]
        public Guid DropPhotoId { get; set; }

        public int ZDiameterInPixels { get; set; }
        public virtual DbSimpleLine SimpleHorizontalLine { get; set; }
        public virtual DbSimpleLine SimpleVerticalLine { get; set; }
    }

    public class DbReferencePhoto
    {
        [Key]
        public Guid ReferencePhotoId { get; set; }

        public virtual DbSimpleLine SimpleLine { get; set; }
    }

[Table("SimpleLines")]
public class DbSimpleLine
{
    [Key]
    public Guid SimpleLineId { get; set; }

    public virtual DbReferencePhoto ReferencePhoto { get; set; }
    public virtual DbDropPhoto DropPhotoHorizontalLine { get; set; }
    public virtual DbDropPhoto DropPhotoVerticalLine { get; set; }
}

我目前的配置:

        modelBuilder.Entity<DbDropPhoto>()
            .HasRequired(s => s.SimpleHorizontalLine)
            .WithRequiredPrincipal(ad => ad.DropPhotoHorizontalLine);

        modelBuilder.Entity<DbDropPhoto>()
            .HasRequired(s => s.SimpleVerticalLine)
            .WithRequiredPrincipal(ad => ad.DropPhotoVerticalLine);

        modelBuilder.Entity<DbReferencePhoto>()
            .HasRequired(s => s.SimpleLine)
            .WithRequiredPrincipal(ad => ad.ReferencePhoto);

我正在嘗試保存新的 dbSimpleLine:

    public async Task CreateOrUpdateSimpleLine(List<DbSimpleLine> dbSimpleLines)
    {
        using (var context = new DDropContext())
        {
            foreach (var dbSimpleLine in dbSimpleLines)
            {
                var dbSimpleLineToUpdate = await context.SimpleLines.FirstOrDefaultAsync(x => x.SimpleLineId == dbSimpleLine.SimpleLineId);

                if (dbSimpleLineToUpdate != null)
                {
                    try
                    {
                        context.Entry(dbSimpleLineToUpdate).CurrentValues.SetValues(dbSimpleLine);
                    }
                    catch (Exception e)
                    {
                        throw new Exception(e.Message);
                    }
                }
                else
                {
                    context.SimpleLines.Add(dbSimpleLine);
                }
            }

            await context.SaveChangesAsync();
        }
    }

當我這樣做時,我得到一個例外:

System.InvalidOperationException: '已檢測到關系'DDrop.Db.DbDropPhoto_SimpleHorizo​​ntalLine' 的角色'DbDropPhoto_SimpleHorizo​​ntalLine_Target' 的沖突更改。

當您有同一個類的多個實例時,您應該明確定義外鍵。 意思是:

[Table("DropPhotos")]
public class DbDropPhoto
{
   [Key]
   public Guid DropPhotoId { get; set; }
   public int ZDiameterInPixels { get; set; }
   public int? SimpleHorizontalLineId { get; set; }
   [ForeignKey("SimpleHorizontalLineId")]
   public virtual DbSimpleLine SimpleHorizontalLine { get; set; }
   public int? SimpleVerticalLineId { get; set; }
   [ForeignKey("SimpleVerticalLineId")]
   public virtual DbSimpleLine SimpleVerticalLine { get; set; }
}

public class DbReferencePhoto
{
   [Key]
   public Guid ReferencePhotoId { get; set; }
   public Guid SimpleLineId { get; set; }
   [ForeignKey("SimpleLineId")]
   public virtual DbSimpleLine SimpleLine { get; set; }
}

[Table("SimpleLines")]
public class DbSimpleLine
{
   [Key]
   public Guid SimpleLineId { get; set; }
   public int? ReferencePhotoId { get; set;}
   [ForeignKey("ReferencePhotoId")]
   public virtual DbReferencePhoto ReferencePhoto { get; set; }
   public int? DropPhotoHorizontalLineId { get; set;}
   [ForeignKey("DropPhotoHorizontalLineId")]
   public virtual DbDropPhoto DropPhotoHorizontalLine { get; set; }
   public int? DropPhotoVerticalLineId { get; set;}
   [ForeignKey("DropPhotoVerticalLineId")]
   public virtual DbDropPhoto DropPhotoVerticalLine { get; set; }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM