Здравствуйте, у меня проблема с моим отображением.
У меня есть классы в иерархической структуре:
- 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