Sto cercando di usare Nullable
Guid
in Entity Framework ma quando ho provato a commettere la modifica che sto ricevendo il messaggio di convalida a causa della chiave esterna è nullo, ho sotto la classe di dominio, DomainType
Class ha child DomainCustomField
: -
public class DomainType
{
public Guid? Id
{
get;
set;
}
private IList<DomainCustomField> _domainCustomFields;
public string Name
{
get;
set;
}
public Guid? AccountId
{
get;
set;
}
public virtual IList<DomainCustomField> DomainCustomFields
{
get
{
return this._domainCustomFields;
}
set
{
this._domainCustomFields = value;
}
}
}
public class DomainCustomField
{
public Guid? Id
{
get;
set;
}
public string Name
{
get;
set;
}
public Guid? DomainTypeId
{
get;
set;
}
}
di seguito è la mappatura: -
modelBuilder.Domain<DomainCustomField>().HasKey((DomainCustomField p) => new
{
p.Id,
p.DomainTypeId
});
modelBuilder.Domain<DomainCustomField>()
.Property(p => p.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Domain<DomainType>()
.HasMany(p => p.DomainCustomFields)
.WithRequired()
.HasForeignKey<Guid?>(x => x.DomainTypeId);
di seguito è riportato un codice di esempio che ho provato ad inserire.
DomainType domainType = new DomainType()
{
AccountId = customer.Id
};
domainType.DomainCustomFields.Add(new DomainCustomField()
{
Name = "Test"
});
Workspace.Add<DomainType>(domainType);
Workspace.CommitChanges();
Errore: - È richiesto un errore di convalida per DomainTypeId
nello stesso codice se cambio Guid?
Guid
in ID variabile quindi il suo lavoro correttamente. Non so come gestire nullable
Guid
. devo impostare manualmente la chiave genitore nel riferimento figlio? allora come funziona bene nel caso di Guid
?
Nota: - Sto usando l'uso di Guid
perché sto lavorando con il database distribuito, dove id può generare da più sistemi di origine. Sto usando Guid?
perché per impostazione predefinita, Guid
genera 00000000-0000-0000-0000-000000000000
per Guid
vuota che può aumentare le dimensioni del database.
Prenderò un approccio leggermente diverso nella mia risposta e cercherò di dirti cosa cambiare per ottenere un esempio funzionante;
Come qualcuno ha sottolineato, gli identificatori univoci non devono essere annullabili, quindi il campo Id
in DomainType
dovrebbe essere un Guid
. Inoltre, dovrai modificare il campo Id in DomainCustomField
. Questi potrebbero aver bisogno di un costruttore vuoto solo per creare un nuovo Guid.
In secondo luogo, la chiave esterna nell'altro oggetto Guid? DomainTypeId
va perfettamente bene, questo può rimanere, ma se rimane è necessario modificare la configurazione.
In questo blocco hai specificato che la proprietà è richiesta?
modelBuilder.Domain<DomainType>()
.HasMany(p => p.DomainCustomFields)
.WithRequired()
.HasForeignKey<Guid?>(x => x.DomainTypeId);
Quindi, semplicemente rendilo opzionale;
modelBuilder.Domain<DomainType>()
.HasMany(p => p.DomainCustomFields)
.WithOptional()
.HasForeignKey<Guid?>(x => x.DomainTypeId);
Questo dovrebbe risolvere i tuoi problemi. Se ci sono domande, fatemelo sapere :)