0

[ Entity Framework 5.0 RC で Code First DbContext を使用する]

ナビゲーション プロパティから派生した ID を持つエンティティ

public class Domain
{
    private string _id;
    private SecondLevelDomain _secondLevelDomain;
    private TopLevelDomain _topLevelDomain;

    public string Id
    {
        get
        {
            // Trigger setter synthesis
            Id = null;
            return _id;
        }
        set
        {
            string parentId = String.Empty;
            if (Sld.Id != null)
                output += Sld.Id + " ";
            if (Tld.Id != null)
                output += Tld.Id;
            _id = parentId;
        }
    }

    public string SecondLevelDomainId
    {
        get;
        set;
    }

    [ForeignKey("SecondLevelDomainId")]
    public SecondLevelDomain Sld
    {
        get 
        { 
            return _secondLevelDomain 
            ?? (_secondLevelDomain = new SecondLevelDomain());
        }
        set 
        { 
            Debug.WriteLine("Foreign Setter Not Called Before Its Too Late");
            _secondLevelDomain = value;
        }
    }

    public string TopLevelDomainId
    {
        get;
        set;
    }

    [ForeignKey("TopLevelDomainId")]
    public TopLevelDomain Tld
    {
        get 
        { 
             return _topLevelDomain 
             ?? (_topLevelDomain = new TopLevelDomain()); 
        }
        set { _topLevelDomain = value; }
    }
}

データベースからのドメイン作成時に親 ID が空と評価される

public CheckDomainInDatabase(string domainId) {
    var domainFromDatabase = Repositor.Domains.Find(domainId);
}
  • InvalidOperationException: The value of a property that is part of an object's key does not match the corresponding property value stored in the ObjectContext. This can occur if properties that are part of the key return inconsistent or incorrect values or if DetectChanges is not called after changes are made to a property that is part of the key.

これらのドメインを集約識別子で取得できるようにする必要があります。これは、他のプロパティの一部を変更する必要があるためです (表示されていません)。しかし、このエラーにより、そのトラックから外れています...

4

1 に答える 1

1

既存のアタッチされたエンティティのキ​​ーは変更できません。エンティティが挿入されると、そのキーは固定されます。変更することはできません。添付されたエンティティのキ​​ーを変更する必要がある場合は、そのエンティティのクローンを作成し、それを新しいものとして挿入する必要があります。

エンティティ フレームワークにおけるエンティティの主なルールは、一意に識別可能である必要があり、この識別が変更されてはならないということです。あなたのクラスは、エンティティ フレームワークの有効なエンティティではありません。

ところで。あなたが作成したものは、エンティティモデルまたはデータベーススキーマをチェックするすべての人にとって少なくとも明らかなエンティティの複合主キーとして使用するSld.Idのと同じです。Tld.Id

于 2012-06-13T19:55:59.883 に答える