Здравствуйте, у меня проблема с отображением.
У меня есть классы в иерархической структуре:
- TaxYear
- Владелец
- EconomyUnit
- Отчет
- ReportItem
- Счет
Все эти классы имеют базовый класс BaseEntity, родительское свойство и свойство parent_id.
Родительское свойство счета-фактуры не принадлежит типу «ReportItem», поскольку «Onwer» имеет отдельный список счетов-фактур, поэтому типом является «BaseEntity».
Это отлично работает, я могу использовать его как родительский «ReportItem» и «Владелец».
Но теперь я хочу «переместить» счета между родителями. На данный момент только от «ReportItem» до «ReportItem».
Установите нового родителя:
foreach (var invoice in oldReportItem.Invoices)
{
invoice.Parent = newReportItem;
}
ctx.SaveChanges();
Это работает без ошибок, но неправильно. EF создал три столбца для моего родительского свойства.
- Owner_Id
- ReportItem_Id
- Parent_Id
Если вы вставите счет-фактуру, оба столбца получат одинаковый идентификатор. Работает нормально, но если вы установите нового родителя, тогда для «Onwer_Id» или ReportItem_Id будет установлено значение null, а Parent_Id будет только обновляться.
Вот моя проблема. Я думаю, что мое отображение неверно. Может кто-нибудь мне помочь?
Fluent-Api
modelBuilder.Entity<ReportItem>()
.HasOptional(p => p.Parent)
.WithMany(p => p.Items)
.HasForeignKey(k => k.ParentId)
.WillCascadeOnDelete(false);
BaseEntity:
public abstract class BaseEntity
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public abstract String GetName();
public DateTime? CreateDate { get; set; }
public DateTime? LastEditDate { get; set; }
public BaseEntity DeepCopy()
{
return (BaseEntity)MemberwiseClone();
}
}
Владелец:
public class Owner : BaseEntity
{
public Owner()
{
Items = new ObservableCollection<EconomyUnit>();
PrivateInvoices = new ObservableCollection<Invoice>();
}
[Required]
public String Name { get; set; }
[Required]
public TaxYear Year { get; set; }
public Guid? YearId { get; set; }
public ICollection<EconomyUnit> Items { get; private set; }
public ICollection<Invoice> PrivateInvoices { get; private set; }
public override string GetName()
{
return Name;
}
}
ReportItem:
public class ReportItem : BaseEntity
{
public ReportItem()
{
Items = new ObservableCollection<Invoice>();
}
[Required]
public String Name { get; set; }
public ICollection<Invoice> Items { get; private set; }
public Guid? ParentId { get; set; }
public Report Parent { get; set; }
}
Счет:
public class Invoice: BaseEntity
{
public String Name { get; set; }
public Guid? ParentId { get; set; }
public BaseEntity Parent { get; set; }
}
Спасибо Lyror