【发布时间】:2014-10-17 16:20:11
【问题描述】:
我有两个实体:UserProfile 和 Inbox
这是我的UserProfile 代码:
public partial class UserProfile {
public int Id { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
//--------------------------
public virtual ICollection<Messages.Inbox> Inboxes { get; set; }
}
public partial class UserProfile {
public static void Configure(DbModelBuilder mb) {
mb.Entity<UserProfile>().HasKey(up => up.Id);
}
}
这是我的Inbox 代码:
public partial class Inbox {
public int Id { get; set; }
public int UserId { get; set; }//FK to userProfile
public Accounts.UserProfile User { get; set; }
public DateTime MessageDateTime { get; set; }
public string Context { get; set; }
public int SenderId { get; set; }//FK to userProfile
public Accounts.UserProfile Sender { get; set; }
}
public partial class Inbox {
public static void Configure(DbModelBuilder mb) {
mb.Entity<Inbox>().HasKey(up => up.Id);
mb.Entity<Accounts.UserProfile>().HasMany(up => up.Inboxes)
.WithRequired(p => p.User)
.HasForeignKey(p => p.UserId);
mb.Entity<Accounts.UserProfile>().HasMany(up => up.Inboxes)
.WithRequired(p => p.Sender)
.HasForeignKey(p => p.SenderId);
}
}
如何管理Inbox 和UserProfile 之间的这两种关系?
【问题讨论】:
-
我不确定您在这里所说的“管理”是什么意思,但是查看您的映射,例如在添加新收件箱实体时使用 EF,您也需要设置用户/发件人属性,并且一旦将父收件箱的 objectState 设置为“已添加”,EF 将标记导航属性也将被添加,这会将 3 个实体添加到数据库中,1 个收件箱和 2 个用户配置文件。这种情况对您的业务有效吗?
-
@omar.alani , no , userId 和 senderId 只是 UserProfile 的 FK,例如,我们有一个 ID 为“5”的 userProfile 和另一个 ID 为“8”的 userProfile,收件箱中的用户 ID 为 5 和senderid 是 8
-
是的,所以技术上你只能设置 SenderId/UserId 和收件箱可以正确保存,但我之前的场景在技术上仍然有效,这意味着你仍然可以从收件箱实体添加用户,如果您不希望这种情况发生,因为您可能会单独设置用户,永远不要通过您的服务公开 Sender/User 属性。
-
@Omar.Alani 我想明白了你的意思,从收件箱中删除发件人并在收件箱和 fluent-api 中使用用户:withrequired(p =>p.user) 为每个 hasForiegnKey(发件人)和(用户)。对吗?
-
如果您有一个 DTO 向用户/ui 公开以添加收件箱,则该 dto 不应包含用户/发件人属性,仅包含 Ids SenderId/UserId,但将它们保留在收件箱实体中,由于您需要从收件箱实体加载有关用户/发件人的一些详细信息,因此您可以使用实体框架将其包含在内,而不是加入 UserProfile 表。希望有帮助。
标签: c# entity-framework asp.net-mvc-4 entity-framework-6 ef-fluent-api