Mam pomysł na projekt domeny, który chciałbym zaimplementować. Używam Entity Framework jako mechanizmu przechowywania i jedyny sposób, w jaki mogę to zobaczyć, nie wydaje się idealny.Przechowywanie relacji opartej na interfejsie w Entity Framework
Mam wiele obiektów domeny i wiele z nich musi być "flagowalnych". Użytkownicy muszą mieć możliwość "oznaczenia" każdego z nich jako wymagającego uwagi w pewien sposób.
Więc pomyślałem, że tworzenie tego interfejsu:
public interface IFlaggable
{
[Required]
Tally Tally { get; }
Guid? TallyId { get; }
}
i tych klas:
public class Flag
{
public Guid Id { get; internal set; }
[Required]
public Tally Tally { get; internal set; }
public Guid TallyId { get; internal set; }
[Required]
public User Creator { get; internal set; }
public Guid CreatorId { get; internal set; }
[Required]
public FlagIndication Indication { get; internal set; }
}
public class Tally
{
public Guid Id { get; internal set; }
public IFlaggable Subject { get; internal set; }
public ICollection<Flag> Flags { get; internal set; }
}
FlagIndication jest enum, jeśli nie jest to oczywiste.
Następnie wszystkie inne obiekty domenowe muszą zrobić, to implementować IFlaggable i stać się flagowymi.
public class TestFlaggable : IFlaggable
{
public Guid Id { get; internal set; }
public Tally Tally { get; internal set; }
public Guid? TallyId { get; internal set; }
}
Wydaje się świetne. Pod względem DB powinno działać dobrze, ponieważ jest to relacja jeden do jednego, a pozostałe tabele zawsze zawierają obcy klucz do pola id tabeli Tallies.
Kłopot w tym, że Entity Framework rzuca okiem na interfejs i dławiki. Oczywiście. Wiemy, że Entity Framework nie działa dobrze z interfejsami.
Jedynym sposobem, jaki widzę, aby działało z Entity Framework, jest złomowanie interfejsu, tworzenie klas potomnych, takich jak "TestFlaggableTally", które dziedziczą po Tally, a następnie każdy inny obiekt może mieć własną specjalną klasę Tally z płatkami śniegu.
public class Tally
{
public Guid Id { get; internal set; }
public ICollection<Flag> Flags { get; internal set; }
}
[Table("TestFlaggableTallies")]
public class TestFlaggableTally : Tally
{
public TestFlaggable Subject { get; internal set; }
}
public class TestFlaggable
{
public Guid Id { get; internal set; }
public TestFlaggableTally Tally { get; internal set; }
public Guid? TallyId { get; internal set; }
}
To powinno zadziałać, ale wydaje się głupie i nadęte.
Tak, jestem tutaj, aby zapytać. Czy istnieje lepszy sposób?
Czy mam pewne podstawowe nieporozumienie?
Czy to moja najlepsza opcja?
ok, uderzył mnie
Co masz na myśli mówiąc EF dławiki? Wiele razy używałem interfejsów do moich jednostek. –
Po prostu nie jest w stanie stworzyć relacji z takiej własności. Rozumiem dlaczego. Nie wie, gdzie to odwzorować. –
Entity Framework nie ma sensu dla właściwości "public IFlaggable Subject {get; internal set;}". –