gpt4 book ai didi

c# - 将导航属性映射到实例变量作为外键

转载 作者:太空宇宙 更新时间:2023-11-03 13:31:47 25 4
gpt4 key购买 nike

我正在使用 .Net Framework 4.0 开发 Entity Framework Code First (v. 4.4.0.0) C# 库。

我不知道如何设置零对一关系。我的模型如下:

A Talk只能由一个用户创建 ( StarterUserId )。
Talk只能有一个收件人用户 ( RecepientUserId ) 或只有一个组 ( RecipientGroupId )。
注意:这意味着RecepientUserId如果 RecipientGroupId 则为 null不为空;或 RecepientUserId如果 RecipientGroupId 则不为空为空。

A user可以是零或 n Talks 的收件人,而是一个 group可以有零个或一个 Talk .

这是Talk类:

[DataContract]
public class Talk
{
[DataMember]
public int TalkId { get; set; }

[DataMember]
public int StarterUserId { get; set; }

[DataMember]
public int? RecipientUserId { get; set; }

[DataMember]
[ForeignKey("RecipientGroup")]
public int? RecipientGroupId { get; set; }

public DateTime DateUtcStarted { get; set; }

[DataMember]
public string DateStarted
{
get
{
return DateUtcStarted.ToString("dd/MM/yyyy HH:mm");
}
set
{
DateUtcStarted = DateTime.Parse(value);
}
}

public User StarterUser { get; set; }
public User RecipientUser { get; set; }

public Group RecipientGroup { get; set; }
}

有了这个TalkConfiguration类:

class TalkConfiguration : EntityTypeConfiguration<Talk>
{
public TalkConfiguration()
{
Property(t => t.StarterUserId).IsRequired();
Property(t => t.RecipientUserId).IsOptional();
Property(t => t.RecipientGroupId).IsOptional();
Property(t => t.DateUtcStarted).IsRequired();

Ignore(t => t.DateStarted);

HasRequired(t => t.StarterUser).
WithMany(u => u.TalksStarted).
HasForeignKey(t => t.StarterUserId);
HasOptional(t => t.RecipientUser).
WithMany(u => u.InTalks).
HasForeignKey(t => t.RecipientUserId);

HasOptional(t => t.RecipientGroup).WithOptionalDependent(g => g.GroupTalk);
}
}

这是 Group类:

[DataContract]
public class Group
{
[DataMember]
public int GroupId { get; set; }

[ ... ]

public Talk GroupTalk { get; set; }
}

还有 GroupConfiguration类:

class GroupConfiguration : EntityTypeConfiguration<Group>
{
public GroupConfiguration()
{
[ ... ] // Nothing related to GroupTalk
}
}

通过这些类和配置,我得到了这个 Talk数据库中的表:

enter image description here

我想制作Talk.RecipientGroupId作为 Group.GroupId外键 .但是这个模型创建了另一列,Talk.RecipientGroup_GroupId作为 Group.GroupIdFOREIGN KEY .而且,我不想要那个。

我该怎么做?

最佳答案

可选:可选的一对一关系被映射为独立关联,而不是外键关联,这意味着您不能在模型类中拥有外键属性。这就是为什么你不能链接 HasForeignKeyWithOptionalDependent 之后.而且我很确定 [ForeignKey] RecipientGroupId 上的属性被忽略,EF 认为 RecipientGroupId作为没有关系目的的普通标量属性。

在数据库模式本身中,关系有一个外键。这就是您看到的具有自动生成的默认名称的名称:RecipientGroup_GroupId .但不支持将此外键映射到属性。但是,我认为您可以使用 MapKey 重命名该列

HasOptional(t => t.RecipientGroup)
.WithOptionalDependent(g => g.GroupTalk)
.Map(m => m.MapKey("RecipientGroupId"));

如果这样做,您必须删除 RecipientGroupId来自 Talk 的属性(property)类,否则 EF 将提示两个具有相同名称的冲突列。

我相信,optional:optional 是唯一独立关联的一对一关系,所有其他都是外键关联,其中外键属性同时是主键属性(根据 Arthur Vickers 的回答在 this thread 的底部)。对于 optional:optional 关系,这是不可能的,因为主键属性不能为空。

由于您的 RecipientGroupId有一个 [DataMember] attribute 看起来你想通过某个服务边界传输值,因此出于某种原因需要外键作为属性值。在这种情况下,我会选择的解决方法是映射 Talk<->Group关系为一对多关系,在 Group 中没有导航属性类(然后使用无参数 WithMany() 调用映射它)或使用集合导航属性,然后确保在业务逻辑中该集合不能包含多个元素。

关于c# - 将导航属性映射到实例变量作为外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20240545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com