3

私のドメイン クラス:

public class Address
{
    [Key]
    public virtual string AddressId { get; set; }

    public virtual Site Site { get; set; }
}

public class Site
{
    [Key]
    public virtual int SiteId { get; set; }

    public virtual Address Address { get; set; }
}

Fluent API を使用したマッピング:

public class SiteMappings : EntityTypeConfiguration<Site>
{
    public SiteMappings()
    {
        HasRequired(s => s.Address)
        .WithOptional(a => a.Site)
        .Map(s => s.MapKey("AddressId"))
        .WillCascadeOnDelete(false);
    }
}

シード方法:

var addresses = new List<Address>
{
    new Address { AddressId = "1" }
};
addresses.ForEach(s => context.Addresses.AddOrUpdate(p => p.AddressId, s));

var sites = new List<Site>
{
    new Site { SiteId = 1, Address = addresses.Single(s => s.AddressId.Equals("1"))}
};
sites.ForEach(s => context.Sites.AddOrUpdate(p => p.SiteId, s));

エラー:

Violation of PRIMARY KEY constraint 'PK_dbo.Addresses'. Cannot insert duplicate key in object 'dbo.Addresses'. The duplicate key value is (1)

新しい「サイト」を追加しようとすると、新しい「アドレス」も挿入されるようです。これを回避する方法は?先ほど追加した DBcontext に既存の「アドレス」を挿入する方法。私は Entity Framework の初心者であり、あなたの助けに本当に感謝しています. 前もって感謝します!

4

2 に答える 2

2

アドレスをサイト インスタンスに割り当てた後、各アドレス インスタンスに次のコードを使用します。

context.Entry(existingAddress).State = EntityState.Unchanged;

これにより、アドレスの状態がUnchanged代わりに設定され、 AddedEF はそれらを 2 回追加しようとしなくなります。

context.SaveChanges()また、アドレスを追加する ForEach の後に呼び出してみてください。

于 2014-07-28T04:40:25.927 に答える
1

現在のコンテキストで管理されている「アドレス」を挿入することで、この問題を解決できました。

new Site { SiteId = 1, Address = context.Addresses.FirstOrDefault(a => a.AddressId.Equals("1"))}

以下のコードは、新しい「アドレス」を挿入しようとする代わりに、現在のコンテキストによって管理されている既存の「アドレス」を利用します。

context.Addresses.FirstOrDefault(a => a.AddressId.Equals("1"))}
于 2014-07-28T11:16:51.863 に答える