复制实体时传输ForeignKey关系

时间:2016-04-30 19:45:22

标签: c# entity-framework primary-key foreign-key-relationship

我有两个实体(MediaFileDescriptorTransformationTest),它们与另一个实体(MediaFileMetaData)集合的两个不同子集具有外键关系。

因此,我的MediaFileMetaData集合的一个子集与MediaFileDescriptor相关联,而我的MediaFileMetaData集合的另一部分与TransformationTest相关联。

TransformationTest.cs:

public class TransformationTest : IEntity
{
    [Key]
    public int Id { get; set;
    public virtual ICollection<MediaFileMetaData> MediaFileMetaDatas { get; set; }

    // some more properties (removed for readability)
 }

MediaFileDescriptor.cs:

public class MediaFileDescriptor : IEntity
{
    [Key]
    public int Id { get; set; }
    public virtual ICollection<MediaFileMetaData> MediaFileMetaDatas { get; set; }

    // some more properties (removed for readability)
}

MediaFileMetaData.cs:

public class MediaFileMetaData : IEntity
{
    [Key]
    public int Id { get; set; }

    public int TransformationTestId { get; set; }
    public virtual TransformationTest TransformationTest { get; set; }

    public int MediaFileDescriptorId { get; set; }
    public virtual MediaFileDescriptor MediaFileDescriptor { get; set; }

    // some more properties (removed for readability) 
}

我现在正在创建这些实体的副本。复制TransformationTest和关联的MediaFileMetaData后,我想创建MediaFileDescriptor的副本。我不想再次复制MediaFileMetaData,但想要将我刚刚在上一步中复制的实体与MediaFileDescriptor的新副本相关联。但由于我的新MediaFileDescriptor有新id,因此复制的MediaFileMetaData引用原始MediaFileDescriptor

所以,我的问题是:如何告诉实体框架我的MediaFileMetaData集合的哪个子集(例如,所有具有旧MediaFileDescriptor.Id的实体)都链接到我的新MediaFileDescriptor

以下是我的关系规范(不确定正确的名称):

modelBuilder.Entity<TransformationTest>()
    .HasMany<MediaFileMetaData>(c => c.MediaFileMetaDatas)
    .WithRequired(c => c.TransformationTest)
    .HasForeignKey(c => c.TransformationTestId)
    .WillCascadeOnDelete(true);

modelBuilder.Entity<MediaFileDescriptor>()
    .HasMany<MediaFileMetaData>(c => c.MediaFileMetaDatas)
    .WithRequired(c => c.MediaFileDescriptor)
    .HasForeignKey(c => c.MediaFileDescriptorId)
    .WillCascadeOnDelete(false);

这是我的(不工作)代码:

var newTests = source.TransformationTests.Select(
    c => new TransformationTest
        {
            // replicating other properties
            MediaFileMetaDatas = c.MediaFileMetaDatas.Select(m => new MediaFileMetaData { Data = m.Data }).ToList()
        });

var newFileDescriptors = source.MediaFileDescriptors.Select(
    c => new MediaFileDescriptor
        {
            // replicating other properties
            MediaFileMetaDatas =  // what should go here?
        });

不幸的是,我的程序很复杂,只能提供一个最小的工作示例......

1 个答案:

答案 0 :(得分:0)

将新的MediaFileDescriptor集合与MediaFileMetaData相关联时,如何以另一种方式创建新的TransformationTest

var newTests = source.TransformationTests.Select(
    c => new TransformationTest
        {
            // replicating other properties
            MediaFileMetaDatas = c.MediaFileMetaDatas.Select(m => new MediaFileMetaData {
                Data = m.Data,
                MediaFileDescriptor = new MediaFileDescriptor {
                    // copy data from existing descriptor
                }
            }).ToList()
        });

如果您需要新创建的描述符,您可以像这样访问它们:

var newFileDescriptors = source.TransformationTests.SelectMany(
    c => c.MediaFileMetaDatas.Select(m => m.MediaFileDescriptor));