C# 尝试在asp.net中创建多对多关系时出错

C# 尝试在asp.net中创建多对多关系时出错,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我在尝试创建多对多关系模型时遇到Asp.Net问题,在尝试注册帐户时出现以下错误: 序列不包含匹配元素 当我“禁用”我的更改时,我可以正常地在网站上注册,因此我的模型中关于列结构的一些错误,我想,但我自己无法修复它们。我想在我的书签和标记表之间创建多对多连接,多对多表应该具有以下结构:Id,Bookmark Id,TagID 以下是我的模型: public class Bookmark { [Key] public int BookmarkID { get; set; }

我在尝试创建多对多关系模型时遇到Asp.Net问题,在尝试注册帐户时出现以下错误:

序列不包含匹配元素

当我“禁用”我的更改时,我可以正常地在网站上注册,因此我的模型中关于列结构的一些错误,我想,但我自己无法修复它们。我想在我的
书签
标记
表之间创建多对多连接,多对多表应该具有以下结构:
Id
Bookmark Id
TagID

以下是我的模型:

public class Bookmark
{   
    [Key]
    public int BookmarkID { get; set; }

    public string Url { get; set; }

    public ApplicationUser UserId { get; set; }

    public virtual ICollection<BookmarkTag> BookmarkTags { get; set; }
}

public class Tag
{
    [Key]
    public int TagID { get; set; }

    [Column(TypeName="varchar(60)")]
    public string TagName { get; set; }

    public virtual ICollection<BookmarkTag> BookmarkTags { get; set; }
}

public class BookmarkTag
{
    [Key, Column(Order = 0)]
    public int BookmarkTagID { get; set; }

    [Key, Column(Order = 1)]
    public int BookmarkID { get; set; }

    [Key, Column(Order = 2)]
    public int TagID { get; set; }

    public virtual Bookmark Bookmark { get; set; }
    public virtual Tag Tag { get;  set;}
}

您的关键属性太多,EF框架无法计算出您的模型。您可以使用fluentapi精确地配置所需的内容。解决问题的最简单方法是使用EF功能约定而不是配置。基本上,遵循惯例,EF框架将为您完成繁重的工作。我在这里添加了一种基于配置的约定方法,它至少在我的VisualStudio中运行。我已经测试了这个,它运行成功

public class Bookmark
{
   public int BookmarkID { get; set; }
   public string Url { get; set; }
   public ApplicationUser UserId { get; set; }
   public virtual ICollection<BookmarkTag> BookmarkTags { get; set; }
 }

 public class BookmarkTag
 {
    public int BookmarkTagID { get; set; }
    public virtual Bookmark Bookmark { get; set; }
    public virtual Tag Tag { get; set; }
 }

 public class Tag
 {
    public int TagID { get; set; }
    public string TagName { get; set; }
    public virtual ICollection<BookmarkTag> BookmarkTags { get; set; }
 }
公共类书签
{
public int bookmark id{get;set;}
公共字符串Url{get;set;}
公共应用程序用户用户ID{get;set;}
公共虚拟ICollection书签标记{get;set;}
}
公共类书签标签
{
public int BookmarkTagID{get;set;}
公共虚拟书签书签{get;set;}
公共虚拟标记{get;set;}
}
公共类标签
{
public int TagID{get;set;}
公共字符串标记名{get;set;}
公共虚拟ICollection书签标记{get;set;}
}

最后我找到了导致错误的原因。。。 就是这条线

 [Column(TypeName="varchar(60)")]
public string TagName { get; set; }

当我删除列(TypeName)部分时,代码就可以顺利编译了。。。它现在可以工作了,但我不知道为什么会这样,或者为什么会抛出那个错误。有人能解释一下为什么它以前不起作用吗?

您检查过InnerException消息吗?顺便说一句,在BookmarkTag中的复合键中不需要BookmarkTagId。只需BookmarkId和TagId就足够了。您可以添加实际引发这些模型错误的代码吗?堆栈跟踪表明它位于AccountController:155附近。根据异常文本,看起来您正在调用.Single()或.First(),但如果不查看实际代码,我们就无法知道这一点。是的,它会在那一行抛出错误,但除了我在那里建立的自己的模型之外,我没有在代码中更改任何内容,当我删除这些模型时,注册将通过。。。当你创建一个新的mvc程序并选中个人帐户选项@CodeNotFound是的,我知道我只是把它放在那里,因为我想添加一个额外的column@IvanRepusic那么你给Single()或First()的谓词是什么方法?很抱歉响应太晚,但这也无法解决问题,我再次遇到相同的错误
 [Column(TypeName="varchar(60)")]
public string TagName { get; set; }