【发布时间】:2014-06-08 08:02:48
【问题描述】:
我正在使用 Entity Framework 6.1.0 Code First、.NET Framework 4.5、C# 和 SQL Server 开发一个库。
我有这两个类:
public class User
{
public int UserId { get; set; }
public string UserName { get; set; }
public ICollection<Group> Groups { get; set; }
public ICollection<Message> MessagesSent { get; set; }
public ICollection<Message> MessagesReceived { get; set; }
}
public class Message
{
public int MessageId { get; set; }
public string Body { get; set; }
public DateTime DateSent { get; set; }
public int UserId { get; set; }
public User Sender { get; set; }
public ICollection<User> Recipients { get; set; }
}
还有这些配置文件:
public class UserConfiguration : EntityTypeConfiguration<User>
{
public UserConfiguration()
{
ToTable("User");
Property(u => u.UserName).IsRequired();
Property(u => u.UserName).HasMaxLength(50);
HasMany(u => u.Groups).
WithMany(g => g.Members).
Map(ug =>
{
ug.MapLeftKey("UserId");
ug.MapRightKey("GroupId");
ug.ToTable("UserGroup");
});
}
}
public class MessageConfiguration : EntityTypeConfiguration<Message>
{
public MessageConfiguration()
{
ToTable("Message");
Property(m => m.Body).IsRequired();
Property(m => m.Body).IsMaxLength();
Property(m => m.DateSent).IsRequired();
HasRequired(m => m.Sender).
WithMany(u => u.MessagesSent).
HasForeignKey(m => m.UserId);
HasMany(r => r.Recipients).
WithMany(m => m.MessagesReceived).
Map(mr =>
{
mr.ToTable("MessageRecipient");
mr.MapLeftKey("MessageId");
mr.MapRightKey("UserId");
});
}
}
我第一次运行这个项目时收到以下消息:
Introducing FOREIGN KEY constraint 'FK_dbo.MessageRecipient_dbo.User_UserId' on table
'MessageRecipient' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION
or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint. See previous errors.
用户不会从我的数据库中删除,但我不知道如何解决这个问题。
我认为问题在于邮件有一个发件人(user),也有一个或多个收件人(user)。这会创建不同的级联路径(SQL Server 不允许这样做)。
如何禁用这些级联路径?也许在Message.Sender。
【问题讨论】:
-
能否包含 Group 类及其配置?我根据此代码添加了一个组,但无法重现此错误。
-
@MárkGergelyDolinka 很抱歉,我在 Group 和 Message 之间没有任何问题。我已经更新了我的问题,删除了对组的任何引用,并且我遇到了同样的错误。
-
谢谢,我询问了组,因为消息和用户实体都与它们有关系。现在我尝试了这个新代码,我在使用迁移创建数据库时没有收到错误,你使用迁移还是初始化程序?其他事情:当删除一个同时接收和发送消息的用户时,我收到错误:{“DELETE 语句与 REFERENCE 约束冲突\”FK_dbo.Messages_dbo.Users_User_UserId\”。冲突发生在数据库\“EF61OnDeleteNoAction\”中,表 \"dbo.Messages\",列 'User_UserId'。\r\n语句已终止。"}
-
不,我正在创建数据库并且我没有使用迁移。今天下午我会给你更多的细节。
-
@MárkGergelyDolinka 您使用的是哪个数据库?我使用的是 SQL Server,它不允许多个级联路径。
标签: c# entity-framework ef-code-first fluent