如何让Entity Framework创建和管理数据库表关系,同时防止重复?

时间:2014-12-03 21:28:56

标签: c# entity-framework

我正在尝试创建一个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创建和管理这种关系,也许有一种更简单的方法来实现我忽略的目标?非常感谢任何帮助。

3 个答案:

答案 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个布尔值?我建议的是 -

  • 创建设置表作为名称 - 值对,其中每个用户当前可以有5条记录。未来可能更少或更多。
  • 允许每个用户拥有自己的一组设置。它几乎不需要任何存储空间,它可以防止对现有设置组合进行不必要的搜索。如果多个用户具有相同的设置,谁在乎呢?
  • 如果你坚持按照自己的方式行事(也许是出于我不知道的原因),我会预先插入32种组合,这样你就可以随时进行查找。无论如何,所有组合迟早都会存在。