首页 新闻 会员 周边 捐助

不知道这算不算Code First的Bug?

0
悬赏园豆:10 [已解决问题] 解决于 2014-06-09 16:28

基本代码如下:

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 约束。
无法创建约束。请参阅前面的错误消息。

雪雁的主页 雪雁 | 初学一级 | 园豆:50
提问于:2014-06-09 15:23
< >
分享
最佳答案
1

没有主键、外键,以及主外键关联

收获园豆:10
Launcher | 高人七级 |园豆:45050 | 2014-06-09 15:35

Id列会默认作为主键的

 

雪雁 | 园豆:50 (初学一级) | 2014-06-09 15:36

这么定义 public User UserA { get; set; }
他会默认生成主外键关联的迁移代码 
我用的EF6

雪雁 | 园豆:50 (初学一级) | 2014-06-09 15:37

你看,这是它生成的迁移代码:

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);

所以我不认为是这里的问题

雪雁 | 园豆:50 (初学一级) | 2014-06-09 15:38

@雪雁: 你的:请你测试下面这段代码:

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 | 园豆:45050 (高人七级) | 2014-06-09 15:48

@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
}
};

}

雪雁 | 园豆:50 (初学一级) | 2014-06-09 15:58

@雪雁: 我调试跟踪过,User的Id都是正确的,所以感觉比较诡异

雪雁 | 园豆:50 (初学一级) | 2014-06-09 15:59

@雪雁: 我求求你就照着我写的代码测试下吧!!!!

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();

}

Launcher | 园豆:45050 (高人七级) | 2014-06-09 16:00

我明白你的意思了,你是怀疑currentUser没受跟踪~~ 也许是这个问题,我试试

雪雁 | 园豆:50 (初学一级) | 2014-06-09 16:04

@雪雁: Thanks!
就是这个原因。

雪雁 | 园豆:50 (初学一级) | 2014-06-09 16:27

@雪雁: 我重新查一遍就好了

雪雁 | 园豆:50 (初学一级) | 2014-06-09 16:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册