[英]What's the proper design for a one-to-one relationship using Fluent NHibernate?
[英]What is the proper way to configure multiple one-to-one relationship?
我有一個實體 DbDropPhoto、DbReferencePhoto 和 DbSimpleLine。 DbSimpleLine 可以以三種不同的狀態存儲在數據庫中:DropPhotoHorizontalLine、DropPhotoVerticalLine、DbReferencePhoto。 這些狀態中的每一個都相互抵消。 例如,作為 DropPhotoVerticalLine 的 SimpleLine,會將 DropPhotoHorizontalLine 和 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_SimpleHorizontalLine' 的角色'DbDropPhoto_SimpleHorizontalLine_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.