我有两个实体(MediaFileDescriptor
和TransformationTest
),它们与另一个实体(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?
});
不幸的是,我的程序很复杂,只能提供一个最小的工作示例......
答案 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));