2

静的データを含むServiceProvidersという名前のテーブルがあります。POCOクラスは次のとおりです

public class ServiceProvider
    {
         public virtual int Id
        {
            get;
            set;
        }

        public virtual string Name
        {
            get;
            set;
        }
 }

Clientテーブルがあります。各クライアントは、「既存の」サービスプロバイダーの1つへの参照を持っている必要があります。

    public class Client
        {
         public virtual int Id
        {
            get;
            set;
        }    

        public virtual string FirstName
        {
            get;
            set;
        }

        public virtual string LastName
        {
            get;
            set;
        }

        public virtual ServiceProvider ServiceProvider
        {
            get;
            set;
        }
}

EFコードの最初の流暢なAPIを使用してクライアントを次のように構成しています

public ClientConfiguration(): base()
        {
            HasKey(e => e.Id);
            Property(e => e.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
            ToTable("dbo.Clients");
            Property(e => e.FirstName).IsRequired().HasMaxLength(256).IsVariableLength().HasColumnType("nvarchar");
            Property(e => e.LastName).IsRequired().HasMaxLength(256).IsVariableLength().HasColumnType("nvarchar");
            HasRequired(e => e.ServiceProvider).WithMany().Map(m => m.MapKey("ServiceProviderId")).WillCascadeOnDelete(false);
}

新しいクライアントのレコードを挿入する場合、既存のServiceProviderインスタンスの参照を取得し、それをクライアントのServiceProviderプロパティに添付します

Client client = new Client() { FirstName = "John", LastName = "Doe" };
client.ServiceProvider = serviceproviders[0]; //An existing ServiceProvider instance fetched from DB earlier

SaveChangesを呼び出すと、EFはServiceProvidersテーブルに新しい(重複した)レコードを挿入します。クライアントテーブルにのみ新しいレコードを挿入し、ServiceProviderId列の値を既存のServiceProviderインスタンスのIDに設定するだけです。

私は何が間違っているのですか?

4

1 に答える 1

2

ServiceProvider新しいものを保存するコンテキストに既存のものをアタッチする必要がありClientますAttach。EFにServiceProviderがデータベースにすでに存在することを通知し、そのServiceProviderのINSERTを防止します。

Client client = new Client() { FirstName = "John", LastName = "Doe" };
context.ServiceProviders.Attach(serviceproviders[0]);
client.ServiceProvider = serviceproviders[0];
于 2012-07-09T22:33:18.353 に答える