我正在尝试创建一个UserPreferences表,它将包含5个布尔值的每个组合,并且将使Entity Framework自动管理保存和检索组合,以便;如果在UserPreferences表中不存在传入的布尔值组合,则会创建它,如果已经存在传入组合,则将使用现有值,而不是使用相同组合创建重复条目。
我知道在不依赖EF的情况下还有其他方法可以做到这一点,但我的问题是:是否有办法通过让Entity Framework创建和管理关系来实现这一目标?
以下是Customer类与UserPreferences类之间的关系:
public class Customer
{
public string MyId { get; set; }
public UserPreferences Preferences { get; set; }
}
public class UserPreferences
{
public bool Bool1 { get; set; }
public bool Bool2 { get; set; }
public bool Bool3 { get; set; }
public bool Bool4 { get; set; }
public bool Bool5 { get; set; }
}
注意:我使用.Net framework 4.5和EF 6。
我试图通过在我的DbContext中配置复合主键来解决此问题,但这不起作用,我还尝试从5个bool值创建复合主键,但这导致了我的客户上的额外行表:
public override void Up()
{
CreateTable(
"dbo.UserPreferences",
c => new
{
Bool1 = c.Boolean(nullable: false),
Bool2 = c.Boolean(nullable: false),
Bool3 = c.Boolean(nullable: false),
Bool4 = c.Boolean(nullable: false),
Bool5 = c.Boolean(nullable: false),
})
.PrimaryKey(t => new { t.Bool1, t.Bool2, t.Bool3, t.Bool4, t.Bool5 });
AddColumn("dbo.Customer", "UserPreferences_Bool1", c => c.Boolean());
AddColumn("dbo.Customer", "UserPreferences_Bool2", c => c.Boolean());
AddColumn("dbo.Customer", "UserPreferences_Bool3", c => c.Boolean());
AddColumn("dbo.Customer", "UserPreferences_Bool4", c => c.Boolean());
AddColumn("dbo.Customer", "UserPreferences_Bool5", c => c.Boolean());
CreateIndex("dbo.Customer", new[] { "UserPreferences_Bool1", "UserPreferences_Bool2", "UserPreferences_Bool3", "UserPreferences_Bool4", "UserPreferences_Bool5" });
AddForeignKey("dbo.Customer", new[] { "UserPreferences_Bool1", "UserPreferences_Bool2", "UserPreferences_Bool3", "UserPreferences_Bool4", "UserPreferences_Bool5" }, "dbo.UserPreferences", new[] { "Bool1", "Bool2", "Bool3", "Bool4", "Bool5" });
DropColumn("dbo.Customer", "UserPreferences");
}
我不确定如何让Entity Framework创建和管理这种关系,也许有一种更简单的方法来实现我忽略的目标?非常感谢任何帮助。
答案 0 :(得分:1)
您想要创建外键。
要在Entity框架中执行此操作,请将您的类更改为如下所示。 UserPreferencesID
告诉我们EF,Customer与单个UserPreferences紧密相关。将virtual
应用于Preferences
属性将允许EF根据其ID自动填充表中属性的值。
public class Customer
{
public string MyId { get; set; }
public int UserPreferencesID { get; set; }
public virtual UserPreferences Preferences { get; set; }
}
public class UserPreferences
{
public int ID { get; set; }
public bool Bool1 { get; set; }
public bool Bool2 { get; set; }
public bool Bool3 { get; set; }
public bool Bool4 { get; set; }
public bool Bool5 { get; set; }
}
答案 1 :(得分:0)
听起来你使用复合键尝试是在正确的轨道上,但是在下面的问题上接受的答案似乎已经使用Fluent API并识别构成模型中的复合键的多个字段。 (我会将此作为评论添加到您的问题而不是答案,但我还没有足够的声誉点来评论)。
Entity Framework: Composite Foreign Key on unique (not primary keys) parent fields
答案 2 :(得分:0)
FWIW,我不会这样做。这可能听起来像挑剔,但这不是一个标准化的设计。谁能保证在用户设置中总会有5个布尔值?我建议的是 -