EntityObject Key jako klucz dla EntityFramework

0

Witam,

Wszystkie encje w aplikacji dziedziczą po EntityObject. Ta klasa ma w sobie Key, jak zrobić aby to Key samo się generowało i było czytane jako klucz dla EntityFramework?
W tej chwili EntityFramework wymaga u mnie stworzenia nowej property Id, a po co skoro dziedziczę po EntityObject, który ma property Key?

0

EntityObject.EntityKey to są metadane EF używane przez jego wewnętrzne mechanizmy, np. w celu śledzenia zmian (podobnie jak np. EntityState). Nie powinieneś z tego korzystać implementując logikę swojej aplikacji. (Po prawdzie takich rzeczy nie powinno być w ogóle w encjach, no ale twórcy EF mają niezwykle małe pojęcie o projektowaniu.)

0

A możesz wytłumaczyć dlaczego nie powinno się tworzyć aplikacji w sposób dziedziczenia klucza głównego dla encji?

0

bo tak naprawdę potrzebujesz klucza dla tabeli w bazie danych

1
Dalmatynczyk napisał(a):

A możesz wytłumaczyć dlaczego nie powinno się tworzyć aplikacji w sposób dziedziczenia klucza głównego dla encji?

Nie rozumiem tego pytania w kontekście mojego postu...

  1. Nie ma problemu, żeby zrobić sobie taką klasę:
public abstract class BaseEntity 
{
    public int Id { get; set; }
} 

i żeby wszystkie klasy zapisywane do bazy z niej dziedziczyły.

  1. Ale jeśli klasa bazowa pochodzi z jakiegoś frameworka i zawiera jakieś pola czy metody na potrzeby jego wewnętrznych mechanizmów, to jest to złe, bo encje, jak i w ogóle cała logika aplikacji, powinny być niezależna od technologii dostępu do danych.
0
somekind napisał(a):
  1. Ale jeśli klasa bazowa pochodzi z jakiegoś frameworka i zawiera jakieś pola czy metody na potrzeby jego wewnętrznych mechanizmów, to jest to złe, bo encje, jak i w ogóle cała logika aplikacji, powinny być niezależna od technologii dostępu do danych.

Klasa EntityObject nie jest wymagana przy tworzeniu encji, encje nie muszą po niej dziedziczyć. Co więcej wcale nie jest wykorzystywana przez entityframework dla swoich własnych mechanizmów.
Ta klasa jest po prostu dodatkiem w bibliotece EF, własnie po to aby nie tworzyć kolejnych klas.

EntityObject ma w sobie tylko kilka metod i właściwości takich jak Key lub DataCreated i ma służyć jako klasa pomocnicza w przechowywaniu danych np. takich jak Id, data zapisu itd.

Dlatego moje pytanie brzmi jak wykorzystać własciwość z tej klasy aby wszystkie encje, które będą dziedziczyły z tej klasy miały przypisane Id własnie to właściwości Key.

0
Grzegorion napisał(a):

Co więcej wcale nie jest wykorzystywana przez entityframework dla swoich własnych mechanizmów.

To bardzo ciekawe, co napisałeś. Ciekawe dlaczego Microsoft twierdzi inaczej:

If an object is being managed by a change tracker, it is expected that IEntityChangeTracker methods EntityMemberChanging and EntityMemberChanged will be used to report changes on EntityKey. This allows the change tracker to validate the EntityKey's new value and to verify if the change tracker is in a state where it can allow updates to the EntityKey.

(źródło: https://msdn.microsoft.com/en-us/library/system.data.entity.core.objects.dataclasses.ientitywithkey.entitykey%28v=vs.113%29.aspx#P:System.Data.Entity.Core.Objects.DataClasses.IEntityWithKey.EntityKey)

Ta klasa jest po prostu dodatkiem w bibliotece EF, własnie po to aby nie tworzyć kolejnych klas.

Jeśli to faktycznie jest jej głównym celem, to znaczy, że to, o co pytasz jest podstawowym i najbanalniejszym przypadkiem użycia. Skoro jednak o to pytasz, to znaczy, że albo Microsoft coś spieprzył, albo nie masz racji. I muszę Cię zmartwić, ale to akurat to jedyny przypadek związany z EF, w którym prawdą jest druga wybór. :)

EntityObject ma w sobie tylko kilka metod i właściwości takich jak Key lub DataCreated i ma służyć jako klasa pomocnicza w przechowywaniu danych np. takich jak Id, data zapisu itd.

DateCreated? Coś Ci się pomyliło: https://msdn.microsoft.com/en-us/library/system.data.entity.core.objects.dataclasses.entityobject%28v=vs.113%29.aspx

Dlatego moje pytanie brzmi jak wykorzystać własciwość z tej klasy aby wszystkie encje, które będą dziedziczyły z tej klasy miały przypisane Id własnie to właściwości Key.

Encja ma Id, a EntityKey jest ustawiony na to Id jako część konfiguracji EF. To działa w tę stronę, nie odwrotnie. Po prostu Microsoft spieprzył swojego ORMa i wymieszał model bazodanowy z konfiguracją. To, że w nowszych wersjach wynaleźli code first (jakieś sto lat po kanibalach z Polinezji) i EntityObject nie jest już potrzebny, tego nie zmienia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1