问题
Pretty simple question. I have a model that has a property which is a System.Uri
type. Uri
s don't have a default parameterless constructor, and no ID field. Is there any way to override my model generation to store it in the DB in a custom way (e.g. just as a string
)? In NHibernate, I've done this before by implementing IUserType
, but I could not find yet a similar mechanism in CodeFirst.
Obviously, I could create a custom type that uses a Uri
under the hood and exposes regular mappable properties & constructor, I'm just curious if there's any way to map this system type so that I don't have to make a wrapper like that.
回答1:
EF does not support custom type mappings like NH.
For System.Uri in particular, I'd use a wrapper property and map the actual value as a string; it's not that bad.
回答2:
This is a very old question but I just had the same question today. With Entity Framework Core 2.1, you can set up a Value Conversion:
public class MyEntityDbConfiguration : IEntityTypeConfiguration<MyEntity>
{
public void Configure(EntityTypeBuilder<MyEntity> builder)
{
builder.Property(e => e.UriField)
.HasConversion(v => v.ToString(), v => new Uri(v));
}
}
public class MyDbContext : DbContext
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfiguration(new MyEntityDbConfiguration());
}
}
回答3:
Unfortunately, there is no direct way to map System.Uri
to string
with EF.
You could however use Data Annotations and attribute your URL property as follows:
[DataType(DataType.Url)]
public string Link { get; set; }
This will able to tell some services that this should be displayed and validated as a URL (ASP.NET and Silverlight for instance have built in support for it).
回答4:
Try doing this..
[Column(Name="MyUri", TypeName="string")]
public Uri MyUri
Make sure you add reference needed for Column Attribute
using System.ComponentModel.DataAnnotations;
Hope that helps...
来源:https://stackoverflow.com/questions/5037022/map-system-uri-using-entity-framework-fluent-api