0

現在、サービス ファサードの下にある Entity Framework 1.0 を使用しています。

以下は、問題のデバイスを更新または挿入するために作成した保存方法の 1 つです。

これは現在機能していますが、参照されたプロパティをnullに設定し、挿入を機能させるためだけにそれらを再アタッチする必要があるのはちょっとしたハックだと感じずにはいられません。changedDevice はすでにこれらの値を保持しているため、再度割り当てる必要があるのはなぜですか。

そこで、モデルを EF4 に更新しようと思いました。そうすれば、外部キーに直接アクセスできます。ただし、これを行うと、ダイアグラムからエンティティを削除して再度追加する以外に、外部キーを追加する簡単な方法がないように思われることがわかりました。DB列名からそれらの名前を変更するすべてのエンティティプロパティをすでに経験しているため、これを行いたくありません。誰でも助けることができますか?

 /// <summary>
    /// Saves the non network device.
    /// </summary>
    /// <param name="nonNetworkDeviceDto">The non network device dto.</param>
    public void SaveNonNetworkDevice(NonNetworkDeviceDto nonNetworkDeviceDto)
    {
        using (var context = new AssetNetworkEntities2())
        {
            var changedDevice = TransformationHelper.ConvertNonNetworkDeviceDtoToEntity(nonNetworkDeviceDto);
            if (!nonNetworkDeviceDto.DeviceId.Equals(-1))
            {
                var originalDevice =
                context.NonNetworkDevices.Include("Status").Include("NonNetworkType").FirstOrDefault(
                  d => d.DeviceId.Equals(nonNetworkDeviceDto.DeviceId));
                context.ApplyAllReferencedPropertyChanges(originalDevice, changedDevice);
                context.ApplyCurrentValues(originalDevice.EntityKey.EntitySetName, changedDevice);
            }
            else
            {
                var maxNetworkDevice = context.NonNetworkDevices.OrderBy("it.DeviceId DESC").First();
                changedDevice.DeviceId = maxNetworkDevice.DeviceId + 1;
                var status = changedDevice.Status;
                var nonNetworkType = changedDevice.NonNetworkType;
                changedDevice.Status = null;
                changedDevice.NonNetworkType = null;
                context.AttachTo("DeviceStatuses", status);
                if (nonNetworkType != null)
                {
                    context.AttachTo("NonNetworkTypes", nonNetworkType);
                }

                changedDevice.Status = status;
                changedDevice.NonNetworkType = nonNetworkType;
                context.AddToNonNetworkDevices(changedDevice);
            }

            context.SaveChanges();
        }
    }
4

2 に答える 2

1

次に、XML エディターで EDMX ファイルを編集する必要があります。おそらく、1 つのテーブルを自動的に更新し、EDMX ファイルを DIFF して変更内容を確認し、他のすべてのテーブルに移動して編集します。

データベース ファーストのアプローチを使用している場合、すべてのフィールド名の名前を変更するのは大胆ですが、危険な動きでした。柔軟性がある場合は、データベース内のフィールドの名前をより適切な名前に変更することをお勧めします。

遭遇するもう 1 つの問題は、EF4 がエンティティ名を複数形にしないように要求しない限り、エンティティ名を複数形にしようとすることです。モデルを EF1 から EF4 に更新し、名前を複数形にする場合は、弱く型付けされた Include() 呼び出しを確認し、それらを修正しながら強く型付けされた多くの .Include() の 1 つに変更することを忘れないでください。ウェブで見つけます。

于 2010-04-28T06:13:31.337 に答える
0

私は同じ問題を抱えていました。これは、モデルを修正することになった方法です。

関係を再構築できるはずです。多対 1 の関係として設定すると、[外部キー プロパティを追加] のチェック ボックスが有効になり、それをチェックしてエンティティにプロパティを追加することができます。名前を修正することを忘れないでください。

ダイアグラム内の線をダブルクリックして、関係の詳細にアクセスすることもできます。

作成されたプロパティは、DB の FK フィールドにマップする必要があることに注意してください。

于 2010-05-22T06:33:21.797 に答える