5

最近、ソフトウェアを .NET 4.0 および EF 4.0 (自己追跡エンティティなし) (以前の .NET 3.5 SP1) にアップグレードしました。現在、以前の作業コードで新しい例外が発生しましたが、これは理解できません。

Resident と呼ばれるエンティティと、ResidentExtension と呼ばれる別のエンティティがあります。これは、すでに大きな Resident エンティティを 1 対 (0/1) の関係で拡張します。次の c# コードは、アプリケーションで新しいエンティティを生成します。

Residents resident = new Residents()
   {
       IsNewResident = true,
       ResidentImage = Settings.Default.ResidentCardDefaultMaleImage,
       IsActive = true,
       ResidentCanBeDeleted = true,
       ResidentExtensions = new ResidentExtensions(),
       ResidentMasterDataState = EvoState.Error,
       ResidentBasicDataState = EvoState.Error,
       ResidentBenefactorsDataState = EvoState.Error,
   };

このステートメントの直後に、次の例外が発生します。

多重度の制約に違反しています。関係 VOCURA.EntityDataModels.EvocuraCarehomeManagementEntityModel.FK_ResidentExtensions_Residents のロール「ResidentExtensions」の多重度は 1 または 0..1 です。

生成されたコードのセッターで発生します。

    [XmlIgnoreAttribute()]
    [SoapIgnoreAttribute()]
    [DataMemberAttribute()]
    [EdmRelationshipNavigationPropertyAttribute("EVOCURA.EntityDataModels.EvocuraCarehomeManagementEntityModel", "FK_ResidentExtensions_Residents", "ResidentExtensions")]
    public ResidentExtensions ResidentExtensions
    {
        get
        {
            return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<ResidentExtensions>("EVOCURA.EntityDataModels.EvocuraCarehomeManagementEntityModel.FK_ResidentExtensions_Residents", "ResidentExtensions").Value;
        }
        set
        {
            ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<ResidentExtensions>("EVOCURA.EntityDataModels.EvocuraCarehomeManagementEntityModel.FK_ResidentExtensions_Residents", "ResidentExtensions").Value = value;
        }
    }

私がまだ見つけた唯一の解決策は、最初に拡張機能なしで Resident エンティティを送信し、その後、外部キー (ResidentID) を設定して ResidentExtension を作成し、それをコンテキストに追加して再度送信することです。しかし、これは以前のやり方ではありません。

これを古い方法で機能させる方法を知っている人はいますか?

4

1 に答える 1

1
ResidentExtensions = new ResidentExtensions(),

この行はまったく必要ないと思います。主キーを持たず、データベースに存在しない新しい ResidentialExtensions オブジェクトを作成しています。コンテキストが常駐拡張機能を保存しようとすると、プロパティが設定されていないため保存できず、null 非許容フィールドに関連するデータベースでいくつかの例外が発生する可能性があります。あなたがする必要があるのは次のことだと思います;

Residents resident = new Residents()
   {
       IsNewResident = true,
       ResidentImage = Settings.Default.ResidentCardDefaultMaleImage,
       IsActive = true,
       ResidentCanBeDeleted = true,
       ResidentMasterDataState = EvoState.Error,
       ResidentBasicDataState = EvoState.Error,
       ResidentBenefactorsDataState = EvoState.Error,
   };
//Now you need to either initialize a residentextextensions entity
// with proper values, or just do not relate it with the resident entity.
ResidentExtensions temp = new ResidentExtensions();
temp.PropertyA = 3;
//etc.
resident.ResidentExtensions = temp;

要約すると、Resident エンティティは ResidentExtensions と 1 - 0,1 の関係にあるためです。右辺が 0 の場合。ResidentExtensions プロパティを null のままにしておきます。それ以外の場合は、適切な ResidentExtensions オブジェクトを初期化し、関連するプロパティを設定します。

于 2012-04-20T06:40:36.660 に答える