3

多くのアイテムの1つがオプションでデフォルトとして指定されているEntity Frameworkで1対多の関係を構築しようとしています。

public class SomeEntity
{
    public int Id { get; set; }
    public Item DefaultItem { get; set; }          // Optional
    public ICollection<Item> Items { get; set; }
}

public class Item
{
    public int Id { get; set; }
    public string ItemName { get; set; }
    public SomeEntity SomeEntity { get; set; }
}

流暢な API での 1 対多の構成は非常に簡単に見えます。

HasMany(e => e.Items).WithRequired(i => i.SomeEntity).WillCascadeOnDelete(true);

しかし、デフォルト項目を実装するための解決策は、とらえどころのないものであることが証明されています。これ(およびさまざまなバリエーション)を試してみましたが、うまくいきませんでした。「指定されたスキーマは無効です」と表示されます。

HasOptional(e => e.DefaultItem).WithRequired(i => i.SomeEntity);

何か案は?前もって感謝します。

4

1 に答える 1

3

これは少し典型的ではない「セットアップ」であり (通常、アイテムの「フラグ」によって指定されますが、同様のものが必要になる可能性があります)、1 つのアイテムを同じ親に 2 回関連付けます。

ただし、これは機能するはずです...

modelBuilder.Entity<SomeEntity>()
    .HasOptional(x => x.DefaultItem)
    .WithOptionalPrincipal() // x => x.DefaultForEntity)
    .WillCascadeOnDelete(false);
...
// public SomeEntity DefaultForEntity { get; set; } // optional

...そして次のように使用します:

var item = new Item { ItemName = "Default1", };
db.SomeEntities.Add(new SomeEntity { DefaultItem = item, Items = new[]
{
    item,
    new Item{ ItemName = "Item1", },
    new Item{ ItemName = "Item2", },
    new Item{ ItemName = "Item3", },
    new Item{ ItemName = "Item4", },
}
});
db.SaveChanges();
于 2013-04-02T00:37:17.957 に答える