实体框架核心多对多具有独特的关联

时间:2018-06-14 16:38:49

标签: asp.net entity-framework asp.net-web-api asp.net-core entity-framework-core

我通过中间表有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();

我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

您的代码应如下所示。您应该使用FileDataTypeId代替FileDataTypeId

var association = new FileMetadataTypeLink()
                {
                    FileDataTypeId = dataTypeId,
                    FileMetadataTypeId = metadataTypeId
                };

   _context.Set<FileMetadataTypeLink>().Add(association );

   _context.SaveChanges();