主/详细信息表和实体框架出现问题



我有一个典型的大纲/细节(用户/设置表(表架构(SQL Server(,并使用Fluent API设置实体框架来处理这些表。

我将其定义为独立关联,因此UserProfileSetting类不包含UserId属性,但我知道在配置中正确映射。

好吧,我的问题是,当为配置文件更新一项Settings时,在数据库级别,所有用户的设置都会更新。基本上不考虑USER_ID

生成的 SQL 查询如下:

UPDATE [dbo].[T_USERPROFILE_SETTING]
SET [VALUE] = @0
WHERE ([KEY] = @1)

知道可能出了什么问题吗?我想如果我最终将UserId属性添加到UserProfileSettings中,这将解决问题,但我想尝试在没有它的情况下解决这个问题。

当前代码如下...

更新数据的代码

var entry = profile.Settings.Where(s => s.Key == key).SingleOrDefault();
if (entry != null)
{
entry.Value = value;
} else {
var setting = /* Here create a new setting */
profile.Settings.Add(setting);
}
DataContext.SaveChanges();

实体:

public partial class UserProfile
{
[Key]
public string UserId { get; set; }
public DateTimeOffset LastLogin { get; set; }
public ICollection<UserProfileSetting> Settings { get; set; }
}
public class UserProfileSetting
{
public UserProfileSetting() { }
public string Key { get; set; }
public string Value { get; set; }
}

实体配置:

public class UserProfileConfiguration : EntityTypeConfiguration<UserProfile>
{
public UserProfileConfiguration()
{
ToTable("T_USERPROFILE");
HasKey<string>(p => p.UserId);
Property(p => p.UserId)
.HasColumnName("USER_ID")
.HasMaxLength(50)
.IsUnicode()
.IsRequired();
Property(p => p.LastLogin)
.HasColumnName("LAST_LOGIN_AT")
.IsRequired();
HasMany<UserProfileSetting>(p => p.Settings)
.WithOptional()
.Map(m => m.MapKey("USER_ID"));
}
}
public class UserProfileSettingConfiguration : EntityTypeConfiguration<UserProfileSetting>
{
public UserProfileSettingConfiguration()
{
ToTable("T_USERPROFILE_SETTING");
HasKey(p => p.Key );
Property(p => p.Key)
.HasColumnName("KEY")
.HasMaxLength(50)
.IsUnicode()
.IsRequired();
Property(p => p.Value)
.HasColumnName("VALUE")
.IsUnicode()
.IsRequired();
}
}

来自 EF 文档...

当模型中不包含外键列时,关联信息将作为独立对象进行管理。通过对象引用而不是外键属性跟踪关系。这种类型的关联称为独立协会。修改独立关联的最常见方法是修改为参与关联的每个实体生成的导航属性。

所以,我错了。 在我的代码中,UserProfile 应该将 UserProfileSet 作为 FK(仅 ID(或独立对象包含在内。

  • 在第一种情况下,用户 ID 应映射到用户配置文件设置,并且用户配置文件中的导航属性应更改为...

    HasMany<UserProfileSetting>(p => p.Settings) .WithOptional() .HasForeignKey(s => s.UserId);

  • 在第两种情况下,(这就是所谓的独立关联(应将新的导航属性添加到用户配置文件的 UserProfileSet 中。

实体框架映射到关系数据库,因此它必须坚持使用其中的一些概念。这里的主要内容是,每个实体都映射到包含该实体所有记录的表,并且需要一些数据来区分关系。

因此,您需要添加USER_ID来判断哪个记录适用于哪个用户(以定义关系(。换句话说,您需要将其放在表和 C# 实体中。

我认为首先在代码中不可能在实体上没有关系属性。另一方面,您可以创建一些额外的 DTO 层来隐藏它。

相关内容

  • 没有找到相关文章

最新更新