首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC5参考指南

MVC5参考指南
EN

Stack Overflow用户
提问于 2015-12-13 18:04:40
回答 1查看 749关注 0票数 0

我正在创建一个这样的表:

代码语言:javascript
复制
public class Team
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public string CaptainId { get; set; }
    public string CoCaptainId { get; set; }
    public string ContactDetails { get; set; }
}

然后我有一张这样的桌子:

代码语言:javascript
复制
public class TeamMember
{
    public string Id { get; set; }
    public string Description { get; set; }
    public string GameDisplayName { get; set; }
    public DateTime Joined { get; set; }
    public string TeamId { get; set; }
}

我有两个问题,我不明白围绕EF 6和MVC5。

1)如何在Team表中引用Id字段。我是将TeamId设置为TeamMember中的字符串还是将其设置为Guid?我知道我需要设置属性[ForeignKey("Team")],但是我仍然不知道如何在代码中正确地引用它,因为每当我需要进行任何类型的比较时,我总是必须在Guid上键入.ToString()才能获得与另一个字符串值进行比较的值。

2)我的TeamMember也有一个Id,这个Id引用身份框架中的用户。我应该如何引用那个Id,这个Id意味着是一个在User表中引用Id的外键,但是我也不知道如何正确地引用它,它是像我所做的那样的字符串,还是Guid或其他什么?

编辑:

代码语言:javascript
复制
public class Team
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public Guid CaptainId { get; set; }
    public Guid CoCaptainId { get; set; }
}

public class TeamMember
{
    public Guid MemberId { get; set; }
    public string TeamId { get; set; }
    public virtual Team Team { get; set; }
    public virtual Member Member { get; set; }
}

public class Member : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string About { get; set; }
    public string Alias { get; set; }
    public string CustomUrl { get; set; }

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<Member> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }
}

public class ApplicationDbContext : IdentityDbContext<Member>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }

    public DbSet<Team> Teams { get; set; }
    public DbSet<TeamMember> TeamMembers { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<IdentityUserClaim>().ToTable("MemberClaim");
        modelBuilder.Entity<IdentityUserRole>().ToTable("MemberRole");
        modelBuilder.Entity<IdentityUserLogin>().ToTable("MemberLogin");
        modelBuilder.Entity<IdentityRole>().ToTable("Role");
        modelBuilder.Entity<Member>().ToTable("Member");
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

我得到的错误:

代码语言:javascript
复制
var user = new Member { UserName = model.Email, Email = model.Email, CustomUrl = model.CustomUrl, Alias = model.Alias};
var team = new Team {CaptainId = user.Id, Created = currentTime, IsSingleMember = true};

CaptainId = user.Id gives an error:

Cannot convert source type 'string' to target type 'System.Guid'

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-13 18:13:29

您应该使用相同的类型,即Guid

代码语言:javascript
复制
public Guid TeamId { get; set; }

此外,您需要在您的virtual Team模型中保留一个Team类型的TeamMember属性。通常情况下,intlongGuid是用于表的主键的类型。string可能不是一个好主意,因为您需要执行自定义代码来生成表中不存在的字符串。

这将生成具有适当外键关系的2个表。

代码语言:javascript
复制
public class Team
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public string CaptainId { get; set; }
    public string CoCaptainId { get; set; }
    public string ContactDetails { get; set; }
}
public class TeamMember
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public string Description { get; set; }
    public string GameDisplayName { get; set; }
    public DateTime Joined { get; set; }
    public Guid TeamId { get; set; }
    public virtual Team Team { set; get; }
}

现在不需要进行ToString()转换来进行比较。您可以执行YourGuid1==YourGuid2表达式

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34254429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档