Ho 2 entità con relazione molti-a-molti attraverso una tabella intermedia:
public class FileDataType
{
public FileDataType()
{
MetadataTypes = new HashSet<FileMetadataTypeLink>();
}
public int Id { get; set; }
public string Name { get; set; }
public ICollection<FileMetadataTypeLink> MetadataTypes { get; set; }
...
}
public class FileMetadataTypeLink
{
public int FileMetadataTypeId { get; set; }
public FileMetadataType FileMetadataType { get; set; }
public int FileDataTypeId { get; set; }
public FileDataType FileDataType { get; set; }
}
public class FileMetadataType
{
public FileMetadataType()
{
FileMetadataTypeLink = new HashSet<FileMetadataTypeLink>();
}
public int Id { get; set; }
public string Name { get; set; }
...
}
FileMetadataTypeLink
è configurato con chiave primaria a più colonne, poiché mi piacerebbe avere una restrizione del database, non creare più volte le stesse associazioni.
modelBuilder.Entity<FileMetadataTypeLink>(entity =>
{
entity.HasKey(x => new { x.FileDataTypeId, x.FileMetadataTypeId});
entity.ToTable("FileMetadataTypeLink");
entity.HasOne(d => d.FileDataType)
.WithMany(p => p.MetadataTypes)
.HasForeignKey(d => d.FileDataTypeId)
.OnDelete(DeleteBehavior.Restrict)
.HasConstraintName("FK_FileMetadataTypeLink_FileDataType");
entity.HasOne(d => d.FileMetadataType)
.WithMany(p => p.FileMetadataTypeLink)
.HasForeignKey(d => d.FileMetadataTypeId)
.OnDelete(DeleteBehavior.Restrict)
.HasConstraintName("FK_FileMetadataTypeLink_FileMetadataType");
});
modelBuilder.Entity<FileMetadataType>(entity =>
{
entity.HasKey(x => x.Id);
entity.ToTable("FileMetadataType");
});
modelBuilder.Entity<FileDataType>(entity =>
{
entity.HasKey(x => x.Id);
entity.ToTable("FileDataType");
});
Quando si inserisce un singolo FileMetadataTypeLink
, per associare FileDataType
esistente con l'oggetto FileMetadata
esistente utilizzando il nucleo di Entity Framework, ricevo un'eccezione SQL:
SqlException (0x80131904): impossibile inserire il valore esplicito per la colonna Identity nella tabella 'FileDataType' quando IDENTITY_INSERT è impostato su OFF.
var association = new FileMetadataTypeLink()
{
FileDataTypeId = dataTypeId,
FileMetadataTypeId = metadataTypeId
};
_context.Set<FileMetadataTypeLink>().Add(association );
_context.SaveChanges();
Cosa mi manca qui?
Il tuo codice dovrebbe essere come sotto Dovresti usare FileDataTypeId
invece di FileDataTypeId
.
var association = new FileMetadataTypeLink()
{
FileDataTypeId = dataTypeId,
FileMetadataTypeId = metadataTypeId
};
_context.Set<FileMetadataTypeLink>().Add(association );
_context.SaveChanges();