基本代码如下:
public class User_Chat
{
public int Id { get; set; }
/// <summary>
/// 发送人A信息
/// </summary>
public User UserA { get; set; }
/// <summary>
/// 发送人B信息
/// </summary>
public User UserB { get; set; }
[InverseProperty("Chat")]
public List<User_ChatMessage> Messages { get; set; }
}
核心业务代码如下,省略了某些片段:
chat = new User_Chat()
{
UserA = currentUser,
UserB = recUser
};
db.User_Chat.Add(chat);
db.SaveChanges();
chat.Messages = new List<User_ChatMessage>()
{
new User_ChatMessage()
{
Chat=chat,
Message = context.Request["Message"],
UpdateTime = DateTime.Now,
SendUser=currentUser,
RecipientUser = recUser
}
};
执行完,相关表数据都是正确的(User_Chat、User_ChatMessage),但是每次都会生成一个Insert user语句,会添加一个用户。
CodeFirst用的不深,不清楚是代码不当还是CodeFirst存在问题。
这么玩,也不行
[ForeignKey("UserA")]
public int UserAId { get; set; }
[ForeignKey("UserB")]
public int UserBId { get; set; }
/// <summary>
/// 发送人A信息
/// </summary>
public User UserA { get; set; }
/// <summary>
/// 发送人B信息
/// </summary>
public User UserB { get; set; }
在Update-Dtabase时,会输出这个异常:
将 FOREIGN KEY 约束 'FK_dbo.User_Chat_dbo.Users_UserBId' 引入表 'User_Chat' 可能会导致循环或多重级联路径。请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。
无法创建约束。请参阅前面的错误消息。
没有主键、外键,以及主外键关联
Id列会默认作为主键的
这么定义 public User UserA { get; set; }
他会默认生成主外键关联的迁移代码
我用的EF6
你看,这是它生成的迁移代码:
CreateTable(
"dbo.User_Chat",
c => new
{
Id = c.Int(nullable: false, identity: true),
UserA_Id = c.Int(),
UserB_Id = c.Int(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Users", t => t.UserA_Id)
.ForeignKey("dbo.Users", t => t.UserB_Id)
.Index(t => t.UserA_Id)
.Index(t => t.UserB_Id);
所以我不认为是这里的问题
@雪雁: 你的:请你测试下面这段代码:
var currentUser = db.User.FirstOfDefault();
var recUser = db.User.FirstOfDefault();
var chat = new User_Chat()
{
UserA = currentUser,
UserB = recUser
};
db.User_Chat.Add(chat);
db.SaveChanges();
@Launcher:
我的代码是这样的
using (var db = new DBContextEntities())
{
var type = context.Request["Type"];
var currentUser = NevelDeal.Bll.Common.GetUserInfo();
var recId = Convert.ToInt32(context.Request["userId"]);
var recUser = db.User.First(p => p.Id == recId);
switch (type)
{
case "add":
#region 添加消息
{
User_Chat chat = null;
if (string.IsNullOrWhiteSpace(context.Request["chatId"]))
{
chat = new User_Chat()
{
UserA = currentUser,
UserB = recUser
};
db.User_Chat.Add(chat);
db.SaveChanges();
chat.Messages = new List<User_ChatMessage>()
{
new User_ChatMessage()
{
Chat=chat,
Message = context.Request["Message"],
UpdateTime = DateTime.Now,
SendUser=currentUser,
RecipientUser = recUser
}
};
}
@雪雁: 我调试跟踪过,User的Id都是正确的,所以感觉比较诡异
@雪雁: 我求求你就照着我写的代码测试下吧!!!!
using (var db = new DBContextEntities())
{
var recId = Convert.ToInt32(context.Request["userId"]);
var currentUser = db.User.First(p => p.Id == recId);
var recUser = db.User.First(p => p.Id == recId);
var chat = new User_Chat()
{
UserA = currentUser,
UserB = recUser
};
db.User_Chat.Add(chat);
db.SaveChanges();
}
我明白你的意思了,你是怀疑currentUser没受跟踪~~ 也许是这个问题,我试试
@雪雁: Thanks!
就是这个原因。
@雪雁: 我重新查一遍就好了