EF CodeFirst Configurace Generické property   zodpovězená otázka

Entity Framework

Zdravím,

mám takový problém a už moc nevím, pročpak to tak je.. :-)

Mám Nějaký

BaseDBContext<T> : DbContext
where T : class, IUser<int> 
{
  
}

kde mám konfiguraci pro T:

public class TConfiguration<T> : EntityTypeConfiguration<T> 
        where T : class, IUser<int>
 {
        public UserConfiguration()
        {
           HasKey(x=>x.Id).Property(x=>x.Id)....;
       }
}

Kdo neví, tak IUser<int> je interface z Identity frameworku:

public interface IUser<out TKey>
  {
    /// <summary>
    /// Unique key for the user
    /// 
    /// </summary>
    TKey Id { get; }

    /// <summary>
    /// Unique username
    /// 
    /// </summary>
    string UserName { get; set; }
  }

Odtamtud je to Id....

Nyní ale, když si implementuju toto rozhraní jako:

 public class TTest : IUser<int>
    {
        public int Id { get; set; }
     }

a zároveň si podědim můj db context..

public class TestDBContext : BaseDBContext<TTest>
    {
        public TestDBContext()
            : base("DefaultConnection")
        {
        }
  
    }

Tak jsem očekával,.. že se mi zavolá OnModelCreating toho BaseDBContextu.. což se samozřejmě děje.. problémem je, že mi EF vyhodí při vytváření modelu exception, že nemůže použít propertu Id, jelikož to není scalární typ / string /byte[]... Přitom při breakpointu je jasné, že se jedná o int...:

Viz obrázek:

http://imgur.com/LQyIQBo

Ještě dodám, že i v základní šabloně vygenerované od VSka s individual accounts dělají defakto téměř to samé.. Bohužel při decompilu IdentityDbContext<TUser...> mi není schopný resharper konfigurační část správně decompilnout..

Tušíte někdo? :-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Když vezmeš ten interface IUser, resp. uděláš si nový, který bude mít property Id get i set, hlásí to pořád ? Nemůže to vyhazovat kvůli tomu ? Páč jak ti to do té proměnné vloži hodnotu, když je podle interface readolny ?

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Hmm velmi zajímavé :-) Logicky, když chci asi propertu nastavit jako Key, tak musí mít i seter.

Tedy kód:

 public interface IMujRole<TKey> : IRole<int>
    {
        new TKey Id { get; set; }
    }

Mi skutečně pomohl.. Musím implementovat IRole<int>, abych ho mohl používat v IdentityFrameworku, ale v mým interfacu můžu overridnout Id a říct, že má public setter.

Takže děkuji.. Stále ale nechápu, jak může původní "z templaty" řešení fungovat...

On tam vkládá IdentityUsera

public class IdentityUser : IdentityUser<string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>, IUser, IUser<string>
  {
    /// <summary>
    /// Constructor which creates a new Guid for the Id
    /// 
    /// </summary>
    public IdentityUser()
    {
      this.Id = Guid.NewGuid().ToString();
    }

    /// <summary>
    /// Constructor that takes a userName
    /// 
    /// </summary>
    /// <param name="userName"/>
    public IdentityUser(string userName)
      : this()
    {
      this.UserName = userName;
    }
  }

který má pak ID i se seterem...:

  public virtual TKey Id { get; set; }

přesto, že implementuje Interface, kde má pouze getter.. a funguje mu to.. Já musím implementovat interface, implementující interface, který mi overriduje propertu Id a přidává jí public setter..

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jeste poradne vyzkousim celou funkcionalitu Identity Frameworku, jeslti to nic nepokazilo a jinak dobrý.. kam mám poslat kytici? ;-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback