2

私が扱っているオブジェクトグラフは基本的に次のとおりです。

public class Resource
    {
        public string Forename { get; set; }
        public string Surname { get; set; }
        public int EmployeeNumber { get; set; }
        public ICollection<Skill> Skills { get; set; }
    }
public class Skill
    {
        public int SkillId{get; private set;}
        public Technology Technology { get; set; }
        public SkillCategory Category { get; set; }
        public SkillCompetency Competency { get; set; }    

    }

既存の Technology、SkillCategory、SkillCompetency の組み合わせを選択することで、新しいスキルをユーザーに追加できます。GraphDiff を使用して、EF が重複した Technology、SkillCategory、SkillCompetency レコードを追加しようとするのを防止しようとしました (そして失敗しました!)。これは、GraphDiff を使用して達成するのは簡単なはずですが、GraphDiff を見つけるだけで EF カップルに比較的慣れていないため、苦労しています。

何か案は?

4

1 に答える 1

2

GraphDiff は基本的に、所有関連の 2 種類の関係を区別します。所有されているということは、所有されているものはすべてその所有者と共に挿入/更新/削除されることを意味する「の一部である」と解釈できます。GraphDiff によって処理されるもう 1 つの種類の関係は関連付けられます。つまり、関連付けられたエンティティ自体ではなく、グラフの更新時に GraphDiff によって変更される関係のみが変更されます。

シナリオに戻ると、重複したいエンティティやエンティティは必要ありませんTechnologyCategoryCompetencyそれらSkillsの組み合わせにすぎないため、重複Skillsは問題ありません。これを GraphDiff を使用してモデル化するにSkillsは、Resource(が所有するResource) との一部としてTechnologyCategoryおよびCompetency関連付けとして考慮するように指示しますSkill。これは次のようにマッピングされます。

// these three entities are all managed separately and have already been saved elsewhere
Technology entityFrameworkCodeFirst;
Category objectRelationalMappers;
Competency notThatIncompetent;

using (DbContext context = new WhatEverYourContextIsNamed())
{
    Resource developer = new Resource
    {
        Skills = new List<Skill> 
        {  
            new Skill
            {
                Technology = entityFrameworkCodeFirst,
                Category = objectRelationalMappers,
                Competency = notThatIncompetent,
            }
        } 
    };
    context.UpdateGraph(developer, 
        map => map.OwnedCollection(r => r.Skills, 
            with => with.AssociatedEntity(skill => skill.Technology)
                        .AssociatedEntity(skill => skill.Category)
                        .AssociatedEntity(skill => skill.Competency)));
    context.SaveChanges();
}
于 2014-03-26T23:20:10.997 に答える