我通过中间表有2个具有多对多关系的实体:
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
配置了多列主键,因为我希望有数据库限制,而不是多次创建相同的关联。
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");
});
当插入单个FileMetadataTypeLink
时,要使用Entity Framework核心将现有FileDataType
与现有FileMetadata
对象相关联,我会收到一个SQL异常:
SqlException(0x80131904):无法在表格中插入标识列的显式值&#39; FileDataType&#39;当IDENTITY_INSERT设置为OFF时。
var association = new FileMetadataTypeLink()
{
FileDataTypeId = dataTypeId,
FileMetadataTypeId = metadataTypeId
};
_context.Set<FileMetadataTypeLink>().Add(association );
_context.SaveChanges();
我在这里缺少什么?
答案 0 :(得分:1)
您的代码应如下所示。您应该使用FileDataTypeId
代替FileDataTypeId
。
var association = new FileMetadataTypeLink()
{
FileDataTypeId = dataTypeId,
FileMetadataTypeId = metadataTypeId
};
_context.Set<FileMetadataTypeLink>().Add(association );
_context.SaveChanges();